美文网首页
初探websocket及手写客户端及服务端创建简易聊天室

初探websocket及手写客户端及服务端创建简易聊天室

作者: 一页莲子 | 来源:发表于2020-11-17 15:49 被阅读0次

websocket作为即时通讯的利器,相对于Ajax轮询性能优化何止甩一条大街!本着上班摸鱼的态度,也是时候研究一下这个好玩的东西了!

如果有看到该文章的小伙伴们,麻烦加一下关注及小爱心点一点,非常感谢!!! 注意点的是以下的知识需要你对\color{red}{NodeJs,WebSocket等}有一定的了解,废话少说,来吧少年! \color{red}{切记!!!几乎手把手教,不要白嫖,一定要点赞加关注!!!}
技术要点:NodeJsnodejs-websocket、js
一、因为此次的websocket纯前端语言,所以需要建两个文件 一个作为客户端 用于用户访问、一个作为服务端 用户服务器反馈信息。

1.初始化你的包 npm init -y
2.npm install nodejs-websocket -D (这里喜欢用yarn或者cnpm安装的都行)

// 1.服务端 server.js
const ws = require("nodejs-websocket")
// socket服务端口
const port  = 8888
// 创建一个玩家进入标识
const enter_user = 0
// 创建一个玩家离开的标识
const live_user = 1
// 创建一个发送消息的标识
const send_user = 2
// 计数用户进入房间
var personNumber = 0
// 创建一个serve服务
const server = ws.createServer(function (connect) {
    console.log('有用户进来了')
    // 附加connect对象 作为当前用户信息
    personNumber++
    connect.userName = `玩家${personNumber}`
    // 开始广播信息 让所有玩家知道你大驾光临!
    broadcast({
        type:enter_user,
        userName:connect.userName,
        content:'',
        time:new Date().toLocaleTimeString()
    })
    // 处理用户发送的信息 text
    connect.on("text", data=>{
        /* 
           处理用户信息 然后返回 单一处理不含广播
           connect.send(data)
        */
    // 开始广播你的龙言
       broadcast({
        type:send_user,
        userName:connect.userName,
        content:data,
        time:new Date().toLocaleTimeString()
      })
    })
    // 连接断开 会触发
    connect.on("close", ()=>{
    //  对于你的离开做一次广播,这可是VIP待遇
        personNumber--
        broadcast({
            type:live_user,
            userName:`${connect.userName}已离开房间`,
            content:'',
            time:new Date().toLocaleTimeString()
          })
    })
    // 处理error事件
    connect.on("error", ()=>{
        console.log('处理error事件,连接异常!')
    })
})
// 处理消息广播
function broadcast(msg) {
    // websocket 只能接受字符串及buffer类型 需要转换一下
    server.connections.forEach(function (conn) {
        conn.sendText(JSON.stringify(msg))
    })
}
// 监听端口
server.listen(port,()=>{
    console.log('服务',port)
})
//2 客户端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text">
    <button>发送</button>
    <div></div>
</body>
<style>
  *,body,html{
    margin: 0;
    padding: 0;
  }
  ul,li{
    list-style: none;
  }
  .color0{
    color: 24px;
    color: green;
  }
  .color1{
    color: 24px;
    color: red;
  }
  .color2{
    color: 24px;
    color: rgb(247, 0, 255);
  }
</style>
<script>
  var input = document.querySelector('input')
  var button = document.querySelector('button')
  var div = document.querySelector('div')
  var Ul= document.createElement('ul')
  var Socket = new WebSocket('ws://localhost:8888')
  Socket.addEventListener('open',function(){
    div.innerHTML  = '已成功偷窃该房间!'
  })
  button.addEventListener('click',function(){
    Socket.send(input.value)
    input.value = ''
  })
  Socket.addEventListener('message',function(e){
    var str = ''
    var Li = document.createElement('li')
    str +=`<div> <p class='color${JSON.parse(e.data).type}'>${JSON.parse(e.data).userName}--------<span class='color${JSON.parse(e.data).type}'>${JSON.parse(e.data).time}</span></p> <p class='color${JSON.parse(e.data).type}'>${JSON.parse(e.data).content}</p></div>`
    Li.innerHTML = str
    Ul.appendChild(Li)
    div.appendChild(Ul)
  })
</script>
</html>
//3 进入你服务端开启node服务
node server.js  或者nodemon server.js

\color{red}{是不是很简单?! 还等什么一波关注一波点赞走起!!!}

相关文章

网友评论

      本文标题:初探websocket及手写客户端及服务端创建简易聊天室

      本文链接:https://www.haomeiwen.com/subject/gugxiktx.html