HTML5 - 开发一个自己的websocket服务器
应用:node.js
主要步骤:
- 创建文件夹
- 创建server.js(服务入口,server为自定义文件的命名)
- npm init -y (快速创建一个package.json文件)
- 依赖包安装:nodejs-websocket (github安装讲解)
- npm i nodejs-websocket
- 依赖包在appjs中的使用 (github how to use讲解)
https://github.com/sitegui/nodejs-websocket#how-to-use-it
配置完毕后启动:
命令行输入> node server.js (server这个名字不固定,具体看你的文件名叫啥)
服务端server.js 源码如下:
1 const ws = require('nodejs-websocket');//引入依赖包 2 const POST = 8080;//定义端口 3 // 创建一个server 4 const server = ws.createServer(connect => { 5 //每次只要有新的用户加入,就会为当前用户创建一个connect对象,同时调用一下这个回调函数。 6 console.log("New connection"); 7 8 // text事件:接收用户请求,得到用户传输进来的数据。 9 connect.on("text", data => { 10 // 每当接受到用户请求事件,这个回调函数就会被触发。 11 console.log("Received "+data); 12 13 // sendText/send 方法:接受到请求后,响应一个数据给用户。因为是connect调用,所以只给当前connet对应的用户发送,如果需要给所有用户发送(广播),需要connections这个数组 14 connect.sendText(data.toUpperCase()+"!!!");//如果直接返回一个data,就会像echo那个服务器一样的功能,接收到什么就返回什么 15 }); 16 17 // 连接断开 触发close事件 18 connect.on("close", (code, reason) => { 19 console.log("connection closed"); 20 code && console.log(code); 21 reason && console.log(reason); 22 }); 23 24 // error:监听服务异常事件,放置因报错而断掉整个服务。 25 connect.on('error', ()=>{ 26 // 如果触发了close事件,就会走error异常事件(刷新也会),所以必须加error 27 console.log('连接出现异常'); 28 }); 29 }); 30 server.listen(POST, ()=>{ 31 console.log('webSocket服务启动成功了,监听了端口'+ POST); 32 });
客户端demo使用上述配置的服务器。 源码如下:
示例页面代码html:
1 <div class="demo"> 2 <input type="text" placeholder="请输入要发送的内容" id="ipt"> 3 <button id="btn">发送请求</button> 4 <p> 5 响应结果如下: 6 </p> 7 <div id="rst"></div> 8 <button id="closeBtn">断开连接</button> 9 </div>
示例页面代码js:
1 // var websocket = new WebSocket('ws://echo.websocket.org');// 使用ws官方提供的服务器 2 var websocket = new WebSocket('ws://localhost:8080'); // 使用我自己配置的服务器,前提要去websocketServer文件夹中把服务启动一下:node server.js 3 websocket.addEventListener('open', function (e) { 4 console.log(e, websocket.readyState); 5 // websocket.send('发送一个方法') 6 // websocket.send('xing.org1^') 7 btn.onclick = function (a) { 8 // console.log(a) 9 websocket.send(ipt.value); 10 } 11 }); 12 // 接收返回值: 13 websocket.addEventListener('message', (e) => { 14 console.log(e); 15 rst.innerHTML = e.data; 16 }); 17 closeBtn.onclick = function (e) { 18 console.log(e); 19 websocket.close(3000,'主动请求断开连接吧');//断开连接 20 } 21 websocket.addEventListener('close', function (e) { 22 console.log('连接断开了', e); 23 });
connections实现聊天室广播:
即给所有的用户(server.connections)都发送消息(sendText):
function broadcast(server, msg) {// 广播函数 server.connections.forEach(function (conn) { conn.sendText(msg) }) }
具体实现方案,见下篇:《websocket的应用 - 实现一个简易的聊天室效果。》
越努力,越幸运;阿门。