> 文章列表 > Node实现 Socket 通信

Node实现 Socket 通信

Node实现 Socket 通信

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 = ++iclientMap[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_readlinereadline - 用于从可读流读取数据 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 实现通信,那么本篇内容就到此结束,感谢大家的支持!!!