今天将会是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 | | 连接事件 | open | Socket.onopen | 连接建立时触发 | message | Socket.onmessage | 客户端接收服务端数据时触发 | error | Socket.onerror | 通信发生错误时触发 | close | Socket.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;
wss.on('connection', function (ws) {
ws.name = ++i;
clients.push(ws)
ws.on('message', function (message) {
broadcast(message, ws)
})
ws.on('close', function () {
console.log('离开');
})
})
function broadcast(msg, ws) {
for (var key in clients) {
clients[key].send(ws.name + '说: ' + msg)
}
}
3、客户端代码
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)
}
<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)
var fs = require('fs');
app.listen(706);
var clients = {};
io.sockets.on('connection', function (socket) {
console.log("connection被触发了");
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){
clients[key].emit('news',data);
}
}
});
客户端:
sayer.value = "游客"+Date.parse((new Date()).toUTCString());
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 !");
});
});
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="发送">
好了,到此结束了,期待下一次的精彩内容吧!
|