zoukankan      html  css  js  c++  java
  • websocket原生开发聊天室

    websocket原生开发聊天室

    chat.html
    <!DOCTYPE html>
    <html lang='en'>
      <head>
        <meta charset='UTF-8'/>
        <meta name="viewport" content = "width=divice-width,initial-scale=1.0"/>
        <title>Socket.IO chat</title>
        <style>
          /* div{
            800px;
            height:500px;
            background-color: bisque;
            border: darkkhaki;
          } */
          button {  9%; background: darksalmon; border: none; padding: 10px; }
        </style>  
      </head>
      <body>
        <input type = 'text' placeholder="请输入你的内容" />
        <button>Send</button>
        <div></div>
      </body>
    </html>
    
    <script>
      const TYPE_ENTER = 0
      const TYPE_LEAVE = 1
      const TYPE_MSG = 2
      var div = document.querySelector('div')
      var button = document.querySelector('button')
      var input = document.querySelector('input')
      //有了自己的server,就可以连接自己的server   ws://echo.websocket.org
        var socket = new WebSocket('ws://localhost:3000');
        socket.addEventListener('open',function(){
          div.innerHTML = '连接成功'
        })
        button.addEventListener('click',function(){
          var value = input.value;
          socket.send(value)
          input.value=''
        })
        socket.addEventListener('message',function(e){
          var data = JSON.parse(e.data)
          console.log(e.data)
          //div.innerHTML = e.data
          var dv = document.createElement('div')
          dv.innerText = data.msg + '---' +data.time
          if(data.type === TYPE_ENTER){
            dv.style.color = 'green'
          }else if(data.type === TYPE_LEAVE){
            dv.style.color = 'red'
          }else{
            dv.style.color = 'blue'
          }
          div.appendChild(dv)
        })
        socket.addEventListener('close',function(){
          div.innerHTML = '服务断开连接'
        })
      </script>
    server.js
    //导入node.js-websocket
    const ws = require('nodejs-websocket')
    const PORT = 3000
    let count = 0  //连接上来的总的用户数量
    const TYPE_ENTER = 0
    const TYPE_LEAVE = 1
    const TYPE_MSG = 2
    //创建一个server
    //每次有用户连接,函数就会被执行,就会给用户创造一个连接对象conn 
    //每个用户都有一个conn
    /*
    为了让消息有格式,颜色这样,需要广播一个对象,
    有type: 0--用户进入   1--用户离开   2--正常消息
    */
    const server = ws.createServer(conn => {
      console.log("an user connected.")
      count ++
      conn.username = `用户${count}`
      //告诉所有用户,有人加入了聊天室
      //broadcast(`${conn.username}进入了聊天室`)
      broadcast({
        type:TYPE_ENTER,
        msg:`${conn.username}进入了聊天室`,
        time:new Date().toLocaleTimeString()
      })
      conn.on('text',data => {
        //我个人感觉,这个server.js就是自己实现那个url实现的功能
        console.log("接收到了用户的数据",data)
        //conn.send(data)   //send只能给此用户发送
        //connect.send(data.toUpperCase()+"!!!")
        //broadcast(data)
        broadcast({
          type:TYPE_MSG,
          msg:data,
          time:new Date().toLocaleTimeString()
        })
      })
    
    conn.on('close',() => {
      console.log("连接断开了")
      count --
      //broadcast(`${conn.username}离开了聊天室`)
      broadcast({
        type:TYPE_LEAVE,
        msg:`${conn.username}离开了聊天室`,
        time:new Date().toLocaleTimeString()
      })
    })
    conn.on('error',() => {
      console.log("用户连接异常")
    })
    
    
    
    })
    
    
    //广播 给所有的用户发送消息
    function broadcast(msg){
      //server.connections表示所有用户
      server.connections.forEach(item => {
        //send:只允许传字符串,现在要传的消息为一个对象,所以需要先转化为字符串
        item.send(JSON.stringify(msg))
      })
    }
    
    
    server.listen(PORT,() => {
      console.log('websocket启动成功')
    })
    
    
  • 相关阅读:
    674. Longest Continuous Increasing Subsequence
    989. Add to Array-Form of Integer
    1018. Binary Prefix Divisible By 5
    53. Maximum Subarray
    1010. Pairs of Songs With Total Durations Divisible by 60
    27. Remove Element
    1089. Duplicate Zeros
    119. Pascal's Triangle II
    830. Positions of Large Groups
    hdu5969最大的位或
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/13708109.html
Copyright © 2011-2022 走看看