nodeJS入门(五)之socket介绍


今天将会是nodeJS系列最后一篇博客,毕竟前端才是No.1~hiahia

1.1、socket介绍

socket:插座;
网络上的两个程序通过一个双向(全双工)的通信连接实现数据的交换,这个连接的一端称为一个socket。就像用座机打电话,给两个座机都插上电话线,就可以打电话,即语音信息的交流。

1.2、socket的通讯流程

  • 服务器端

1、创建socket,表示有了一个电话
2、绑定socket和端口号,相当于,电话对应了一个电话号码
3、监听端口号,相当于,把电话插上电话线,可以随时等待有人拨通电话
4、接收客户端的连接请求,相当于有人打来了电话
5、从socket中读取字符,相当于,接起电话,有语音信息传输过来了
6、关闭socket,相当于通话完成后,挂掉电话

  • 客户端

1、 创建socket,表示有了一个电话(当然也默认绑定了端口号)
2、连接指定的计算机端口(服务器的地址和端口),相当于拨打电话
3、向socket中写入信息,相当于给对方说话
4、关闭socket,相当于通话完成后,挂掉电话

1.3、webSocket

WebSocket是HTML5新增加的原生的对象,是一个通信的协议(ws协议)。是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。

在WebSocket API中,浏览器和服务器只需要做一个握手(handshaking)的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

单工: 只能单向, 传呼机
半双工:双向,但是同时只能一方通信,对讲机
全双工:双向,双方都可以同时传输信息,电话

对比webSocket协议和http协议:

HTTP协议是不支持持久连接的(长连接)
Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。

1.4、webSocket对象介绍

1.4.1、属性
属性描述
readyState只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立。1 - 表示连接已建立,可以进行通信。2 - 表示连接正在进行关闭。3 - 表示连接已经关闭或者连接不能打开。
bufferedAmount只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数
1.4.2、事件
事件事件处理程序描述
connection连接事件
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发
1.4.3、方法
方法描述
send()使用连接发送数据
close()关闭连接

1.5、使用步骤

1、安装ws模块(webSocket)

 npm  i ws  --save

ws:是nodejs的一个WebSocket库,可以用来创建服务。

客户端send函数触发 服务器官方事件message。

2、服务器端代码

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 9000 });

let clients = [];  //记录客户端对象  
let i =0; //记录客户端 序号

//绑定事件connection,此事件是当有客户端连接时,触发
wss.on('connection', function (ws) { //ws就是连接的客户端对象
        ws.name = ++i; 
        clients.push(ws) //把客户端对象保存起来
    
        //给客户端对象绑定事件message,当客户端发送信息时,触发该事件
        ws.on('message', function (message) { //给客户端对象绑定message事件,有信息发过来了。
            broadcast(message, ws) //把客户端发送来的信息,广播给其它客户端。 
        })
    
        ws.on('close', function () { //给客户端对象绑定close事件,客户端关闭了
            console.log('离开');
        })
})
    
//广播信息
function broadcast(msg, ws) {//broadcast是把信息发布(广播)给其它客户端
       for (var key in clients) { //clients: 记录着所有的客户端对象
           clients[key].send(ws.name + '说: ' + msg)
       }
}

3、客户端代码

//js代码:WsClient.js
//new WebSocket(),就触发了服务器端的connection事件
var ws = new WebSocket('ws://127.0.0.1:9000/')

//当连接上服务器端,即打开连接后,触发
ws.onopen = function () {
  ws.send('大家好')
}

//当接收到(服务器端的)信息后,触发
ws.onmessage = function (event) {
  var chatroot = document.getElementById('chatroom');
  chatroom.innerHTML += '<br/>' + event.data
}
//当服务器端关闭时,触发
ws.onclose = function () {
  console.log('Closed')
}
//当出错时,触发
ws.onerror = function (err) {
  alert('Error:' + err)
}

//html代码
<h1>WebSocket</h1>
  <div id="chatroom" style="width:400px;height:300px;overflow:auto;border:1px solid blue"></div>
  <input type="text" name="sayinput" id="sayinput" value="">
  <input type="button" name="send" id="sendbutton" value="发送">
      
  <script src="WsClient.js"></script>

  <script type="text/javascript">
   
   function send() {
      ws.send(sayinput.value);
      sayinput.value = '';
    }

    document.onkeyup = function (event) {
      if (event.keycode == 13) {
        send();
      }
    }
    sendbutton.onclick = function () {
      send();
    }
  </script>

1.6、socket.io

  • 介绍

​ 如果浏览器不支持HTML5,即没法直接使用websocket。我们还需要使用socket.io来考虑兼容性。即,如果支持HTML5,就用websocket,如果不支持HTML5就使用socket.io。Socket.io使用检测功能来判断是否建立WebSocket连接。Socket.IO还提供了一个NodeJS API

  • 思路

服务器和客户端用触发自定义事件的方式传递数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuzYfUt9-1630062694257)(E:\typora\typora-user-images\04socket02.png)]

  • 实例代码

1、 使用node 的express和socket.io
2、 安装express
3、 安装socket.io

  npm  i  express  socket.io
  前端代码需要引入“socket.io.js”

服务器端:

var app = require('http').createServer(function (req, res) { })
var io = require('socket.io').listen(app) //把socket.io和web服务器关联起来
var fs = require('fs');

app.listen(706); //监听端口号

//保存所有的客户端
var clients = {};

io.sockets.on('connection', function (socket) {
        console.log("connection被触发了");
        //有客户端连接,发送消息 (f 是自定义事件)
        socket.on('f', function (sayer, fn) {
            //如果没有保存改客户端,那么就保存该客户端
            if (!clients[sayer]) {
                clients[sayer] = this;
            }
            console.log(clients);
            fn();
     });
        
socket.on('message', function (data) {
        console.log("message被触发了");
        broadcast(data);
});
    
function  broadcast(data){
         for(let key in clients){
              //给客户端发送消息,使用事件,emit触发事件 news	
            clients[key].emit('news',data);
         }
     }
 });


客户端:

sayer.value = "游客"+Date.parse((new Date()).toUTCString());
// 创建对象,并连接服务器端(触发服务器端的connection事件)
let socket  = io.connect("http://10.35.162.21:706");
// 连接事件
socket.on("connect",function(){
    console.log("connect");
    // 连接建立起来后,打个招呼
    socket.emit('f',sayer.value, function () {
        socket.send(sayer.value+"说:hello !"); //send函数触发的是服务器端message事件
    });
});

socket.on("news",function(data){
    console.log("news被触发了");
    chatroom.innerHTML += data+"<br/>";
})
sendbutton.onclick = function(){
    socket.send(sayer.value+"说:"+sayConent.value); 
    sayConent.value="";
}
    <div id="chatroom" ></div>
    <input type="text"  id="sayer" >说:
    <input type="text"  id="sayConent" >
    <input type="button"  id="sendbutton" value="发送">

好了,到此结束了,期待下一次的精彩内容吧!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值