zoukankan      html  css  js  c++  java
  • nodejs之websocket聊天小系统

      WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。( HTTP 协议有一个缺陷:通信只能由客户端发起。)

    websocket的特点:

    (1)建立在 TCP 协议之上,服务器端的实现比较容易。

    (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

    (3)数据格式比较轻量,性能开销小,通信高效。

    (4)可以发送文本,也可以发送二进制数据。

    (5)没有同源限制,客户端可以与任意服务器通信。

    (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。(ws://example.com:80/some/path

    websocket详解地址:http://www.ruanyifeng.com/blog/2017/05/websocket.html

              https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

    //npm init 项目初始化

    npm install ws -D

    创建server.js  代码如下:

    //ws协议
    const WebSocket = require('ws')

    const server = new WebSocket.Server({port:8000})

    let clients = []
    //当一个client链接过来时,把这个client信息存处起来
    //转发给所有的client
    server.on('connection',(client)=>{

    client.id = clients.length
    clients.push(client)

    client.on('message',(chunck)=>{
    //接收导数据后把数据分发给所有的人

    clients.forEach((cli)=>{
    cli.send(chunck)
    })
    })
    client.on('close',(chunck)=>{
    clients[client.id] = null
    })
    client.on('error',(chunck)=>{
    clients[client.id] = null
    })

    })

    创建index.html ,可以创建多喝相同代码的html页面,代码如下: 

    <body>
    <div>
    <input type="text" id="input">
    <button id="btn">发送</button>
    </div>
    <ul id="container"></ul>
    <script>
    //服务器端的ip地址ws://127.0.0.1:8000
    var client = new WebSocket('ws://127.0.0.1:8000')
    // //此处on是js的语法的事件绑定,应该与nodejs语法区分开(server.on("message"()=>{})
    // client.onmessage = function(e){
    // //js中事件回调函数中第一个参数 event对象
    // console.log(e)
    // }
    // index.html:18 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

    // 指数:18 domexception。HTML错误:未能执行“发送”“WebSocket”:仍处于连接状态。
    // //client.send('hello world')报上述错误 ;但凡关于前后台连接点的 都是异步(通过事件函数解决)
    // document.onclick = function(){
    // client.send('hello world');
    // }
    //接受信息;
    client.onmessage = function(e){
    // console.log(e);
    var li = document.createElement("li");
    li.innerHTML = e.data + " ;" + new Date().toISOString();
    container.appendChild(li);
    }
     
    //发送信息部分;
    btn.onclick = function(){
    var sendmsg = input.value;
    client.send(sendmsg);
    input.value = "";
    }
     
    </script>
    </body>
  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/fengch/p/8632879.html
Copyright © 2011-2022 走看看