使用websocket+html+nodejs快速搭建一個建議的在線聊天功能

1像寒、先新建一個html網(wǎng)頁用于展示效果

<!DOCTYPE html>
<html>
 
<head>
  <style>
    /* #box{
        width: 300px;
        height: 300px;
        border: 1px rgb(158, 158, 158) solid;
      } */
  </style>
</head>
 
<body>
  <!-- 用于用戶輸入 -->
  <input type="text" placeholder="請輸入" id="ipt">
  <button id="btn">發(fā)送請求</button>
  <!-- 聊天框 -->
  <div id="box">
 
  </div>
 
  <script>
    //html5自帶ws州既,這里直接創(chuàng)建ws對象,并輸入發(fā)送地址
    var socket = new WebSocket('ws://localhost:3000')
    //簡單的創(chuàng)建三個常量用于分別提示信息萝映,離開信息吴叶,普通消息
    const TYPE_ENTER = 0
    const TYPE_LEAVE = 1
    const TYPE_MSG = 2
    //用于測試,是否連上服務器服務端
    socket.addEventListener('open', function () {
      document.getElementById("box").innerText = '服務建立成功'
    })
    //定義發(fā)送信息按鈕的點擊事件
    document.getElementById('btn').addEventListener('click', function () {
     
      //獲取輸入框中的信息
      var value = document.getElementById('ipt').value
      //調(diào)用ws對象發(fā)送信息
      socket.send(value);
 
      document.getElementById('ipt').value = ''
    })
  
 
    //ws對象的接收信息方法序臂,用于接收服務器發(fā)送給瀏覽器的信息
    socket.addEventListener('message', function (e) {
      var data = JSON.parse(e.data)
      //新建div蚌卤,用于追加到box中
      var dv = document.createElement('div')
      //拼接一下服務器返回過來的數(shù)據(jù),做一些簡單的格式處理
      dv.innerText = data.msg + "--" + data.time
      //判斷發(fā)送出來的信息的類型奥秆,用不同的顏色做區(qū)分
      if (data.type===TYPE_ENTER){
        dv.style.color='green'
      }
      if (data.type===TYPE_LEAVE){
        dv.style.color='red'
      }
        //把新消息追加到聊天框中逊彭,提供給所有人查閱
        document.getElementById("box").appendChild(dv)
    })
  </script>
</body>
 
</html> 

2、使用nodejs搭建一個簡單的websocket服務

一构订、 可以在第一步的index.html同級目錄下侮叮,創(chuàng)建一個新的文件夾 ,如websocket,然后在websocket文件夾中創(chuàng)建一個app.js文件悼瘾。如下圖:
c1bc7b17acd2c40641f9816ed7ec5e56_413fdf33756a460285f0bdecbfa6e296.png
二囊榜、在app.js中編寫一個簡單的本地websocket服務先使用 npm install nodejs-websocket 安裝依賴
const WebSocket = require('nodejs-websocket')//引入剛剛npm下載的依賴
const PORT=3000    //設置監(jiān)聽的端口
 
//簡單的定義一下不同的消息常量
const TYPE_ENTER=0 
const TYPE_LEAVE=1
const TYPE_MSG=2
 
//記錄聊天組人數(shù)
var count=0
 
//創(chuàng)建wb服務
const wss = WebSocket.createServer(connect=>{
//當有人連接成功,人數(shù)+1
  count++
//設置新來的用戶的亥宿,用戶名稱
  connect.userName=`用戶${count}`
//自己在封裝的卸勺,集體廣播/發(fā)送信息的方法
//有人連接上了我們的聊天組,自動發(fā)消息告訴當前聊天組所有人
//發(fā)送一個對象烫扼,里面封裝了消息類型曙求,具體信息,當前時間
  broadcast({
    type:TYPE_ENTER,
    msg:`${connect.userName}進入了聊天室`,
    time:new Date().toLocaleTimeString()
  })
 
//ws自己的方法,當接收到用戶信息時觸發(fā)
//這里直接調(diào)用集體廣播方法悟狱,發(fā)送給所有人
  connect.on("text",data=>{
    broadcast({
      type:TYPE_MSG,
      msg:data,
      time:new Date().toLocaleTimeString()
    })
  })
//ws自己的方法静浴,當有 用戶離開當前聊天組時觸發(fā)
  connect.on("close",data=>{
   //有人離開,當前人數(shù)減一
    count--
//發(fā)送消息的邏輯與上面同理
    broadcast({
      type:TYPE_LEAVE,
      msg:`${connect.userName}離開了聊天室`,
      time:new Date().toLocaleTimeString()
    })
  })
//ws自己的方法挤渐,簡單的處理一下異常
  connect.on("error",data=>{
    console.log('發(fā)生異常');
  })
})
 
//自己封裝的全體廣播方法苹享,
function broadcast(msg){
  //使用ws中的connections方法獲取到當前聊天組的所有用戶信息
  //循環(huán)發(fā)送信息給不同的用戶
  wss.connections.forEach(item=>{
  console.log("msg",msg);
    //這里轉(zhuǎn)json因為原生的websocket不支持發(fā)送json,所以轉(zhuǎn)一下字符串
    item.send(JSON.stringify(msg))
  })
}
 
//監(jiān)聽端口
wss.listen(PORT,()=>{
  console.log("服務啟動成功");
})

然后使用 node ./app.js啟動即可

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挣菲,一起剝皮案震驚了整個濱河市富稻,隨后出現(xiàn)的幾起案子掷邦,更是在濱河造成了極大的恐慌白胀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抚岗,死亡現(xiàn)場離奇詭異或杠,居然都是意外死亡,警方通過查閱死者的電腦和手機宣蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門向抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胚委,你說我怎么就攤上這事挟鸠。” “怎么了亩冬?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵艘希,是天一觀的道長。 經(jīng)常有香客問我硅急,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任落恼,我火速辦了婚禮关霸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荚板。我一直安慰自己凤壁,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布跪另。 她就那樣靜靜地躺著客扎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罚斗。 梳的紋絲不亂的頭發(fā)上徙鱼,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼袱吆。 笑死厌衙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绞绒。 我是一名探鬼主播婶希,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓬衡!你這毒婦竟也來了喻杈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狰晚,失蹤者是張志新(化名)和其女友劉穎筒饰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壁晒,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瓷们,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秒咐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬晕。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖携取,靈堂內(nèi)的尸體忽然破棺而出攒钳,到底是詐尸還是另有隱情,我是刑警寧澤雷滋,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布不撑,位于F島的核電站,受9級特大地震影響惊豺,放射性物質(zhì)發(fā)生泄漏燎孟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一尸昧、第九天 我趴在偏房一處隱蔽的房頂上張望揩页。 院中可真熱鬧,春花似錦烹俗、人聲如沸爆侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔仰。三九已至,卻和暖如春蕉鸳,著一層夾襖步出監(jiān)牢的瞬間乎赴,已是汗流浹背忍法。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榕吼,地道東北人饿序。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像羹蚣,于是被迫代替她去往敵國和親原探。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容