socket 通信流程
Socket通信,首先要知道 Socket 是什么,就是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端被称为 socket ,举一个简单的例子就是两个人在线上进行聊天,即线上通信,那么socket通信的流程具体是怎样的?下面通过一张图来了解 socket 的通信流程:
下面就来实现 socket通信,分两部分,其一是服务端,再者是客户端,那么先来按照图示的流程来完成对服务端(S端)的编写:
[ 小白注解:Node.js中提供了Net核心模块对 socket 的支持,需要引入Net模块,使用 net 提供的createServer() 方法创建基于流的 TCP 或 [IPC][] 服务器,创建一个变量保存客户端对象,使用 .on( 'connection' 监听用户是否接入,使用 .on('data' 对客户端发送消息的监听,同时对这个消息内容进行一个事件的广播,使用 .on('close' 监听数据错误的处理,使用 .on(close 对客户端关闭事件的监听,[可选] 进行一个服务器启动端口的监听使用listen()方法 ]
const net = require('net')
var chatServer = net.createServer(), // 创建TCP服务器
clientMap = new Object() // 存储客户端对象
var i = 0 // 连接名称流水号
chatServer.on('connection', function (client) {
console.log('客户端用户接入...')
client.name = ++i
clientMap[client.name] = client
// 对客户端发送消息的监听
client.on('data', function (data) {
console.log('客户端传来:' + data)
broadcast(data, client)
})
// 数据错误事件处理
client.on('error',function (err) {
console.log('Client Error : ' + err )
client.end()
})
// 客户端关闭事件
client.on('close',function (data) {
delete clientMap[client.name]
console.log(client.name + '下线了')
client.broadcast(client.name + '下线了', client)
})
})
// 消息广播
function broadcast(message, client){
for (var key in clientMap) {
clientMap[key].write(client.name + ':' + message + '\n')
}
}
// 监听9000端口号
chatServer.listen(9000,() => {
console.log('Socket Server Running ...')
})
那么对服务端(S端)已经编写完成,可以自测一下是否启动成功,这里不再演示,待后续客户端一同演示;下面来完成客户端(C端)的编写:
[ 小白注解:引入Net模块,创建一个socket - new net.socket() ,connect()方法连接指定的服务端的端口 (host,port) ,连接到服务器(S端)之后,通过.on('data' 监听服务端传来的数据信息,同时可以向服务器进行数据发送传递,通过Node.js提供的 readline 模块,使用createInterface()方法构造,同时需要 .on('error' 做事件错误处理 和.on('close' 做用户下线反馈 ]
var net = require('net')
var port = 9000
var host = '127.0.0.1'
var client = new net.Socket()
client.setEncoding = 'UTF-8'
// 连接服务器
client.connect(port, host, function () {
client.write('欢迎!')
})
// 收集
client.on('data',function (data) {
console.log('服务端传来:' + data)
talk()
})
// 错误事件处理
client.on('error',function (err) {
console.log('Error:' + err)
})
// 关闭连接
client.on('close',function (){
console.log('Connection Closeed')
})
/* https://www.nodeapp.cn/readline.html#readline_readline
readline - 用于从可读流读取数据 process.stdin-输入 process.stdout-输出 */
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
function talk() {
rl.question('请输入:',(inputStr) => {
if(inputStr != 'bye'){
client.write(inputStr + '\n')
}else{
client.destroy()
}
})
}
以上已经完成S端和C端的代码编写,下面来进行测试运行!
socket 测试效果
· 打开CMD窗口切到编写目录文件进行运行( 运行命令: node + xx.js )
S端文件 :SocketServer.js —— node SocketServer.js
C端文件 :SocketClient.js —— node SocketClient.js
1. 启动服务器
2. 启动客户端
启动客户端之后,此时客户端创建一个socket,连接服务器(127.0.0.1:9000),当客户端与服务器接入成功之后就会使用write()方法写入,此时服务器就会通过 .on('connection' 监听到有用户接入会进行一个打印,以及 .on('data' 监听到客户端传递的数据,调用 broadcast() 方法进行广播
3. 回看服务器
4. 在客户端中输入数据
输入之后,会进行调用 talk()方法,进行一个写入,此时服务器监听到客户端的数据会对数据进行一个广播,此时被客户端监听到服务器广播的数据进行一个打印 .on('data',function(){ console.log('服务器传来'....) }) ,所以会返回服务端传...这段;可以看一下服务端是不是收到客户端传过去的这个 “在吗?” ,如下图:
5. 再启动一个客户端
启动第二个客户端之后,可以会看服务端,是否会有客户端接入的提示:如下
那么第二个客户端的接入传到服务端会被服务端进行一个广播,此时在第一个客户端中是会监听来自服务端的一个广播并打印处理,如下:
6.在第二个客户端输入消息
· 第二个客户端
· 第一个客户端
· 第二个客户端
收到来自第一个客户端的广播信息 !
7. 下线
以上就是使用Node中的Net模块对socket通信的一个实现,那么在之后回来将另外一个 WebSocket 实现通信,那么本篇内容就到此结束,感谢大家的支持!!!