nodejs socket 笔记

lyh1091106900

搭建最简单的socket 服务端和客户端,这次的文章主要是明白net.socket的对象作为流是如何发挥作用的
net.socket官网描述是这样的

此类是 TCP 套接字或流式 IPC 端点的抽象(在 Windows 上使用命名管道,否则使用 Unix 域套接字)。 它也是一个 EventEmitter

net.Socket 可以由用户创建并且直接地与服务器进行交互。 例如,它由 net.createConnection() 返回,因此用户可以使用它与服务器进行通信。

它也可以由 Node.js 创建,并在收到连接时传给用户。 例如,将它传给 net.Server 上触发的 'connection' 事件的监听器,因此用户可以使用它与客户端进行交互。

先贴一下代码

  • client.js
 // 1 引入模块
const net = require('net');
const readline = require('readline');
// 2 创建套接字和输入输出命令行
let rl = readline.createInterface({
// 调用std接口
input:process.stdin,
output:process.stdout
})
let client = new net.Socket();
// 3 链接
client.connect(800,'localhost');

client.setEncoding('utf8');
client.on('data',(chunk)=>{
   console.log('shoudao:',chunk)
})
client.on('error',(e)=>{
console.log(e.message);
})
// 绑定输io流事件,获取输入输出字符
rl.on('line',(mes)=>{
client.write(mes);
})
  • server.js
// 1 引入模块
const net = require('net');
// 2 创建服务器
let clientArr = [];
const server = net.createServer();
// 3 绑定链接事件
server.on('connection',(person)=>{
console.log(clientArr.length);
// 记录链接的进程
person.id = clientArr.length;
clientArr.push(person);
//person.setEncoding('utf8');
// 客户socket进程绑定事件
person.pipe(clientArr[0])
person.on('close',(p1)=>{
clientArr[p1.id] = null;
} )
person.on('error',(p1)=>{
clientArr[p1.id] = null;
})
})
server.listen(800);
console.log('chuangjiang ok')

client.js中client对象和server.js就可以当成流使用,而且是个双工流。server.js中我是用person.pipe(clientArr[0])的写法这种可独流和可写流是一一对应的。其实不适合用来做广播。你可以修改成下面这种写法:

person.on('data',(chunk)=>{
console.log(chunk);
clientArr.forEach((val)=>{
// 数据写入全部客户进程中
val.write(chunk);
})

关于流的介绍可以参考下面的文章

阅读 116
1 声望
0 粉丝
0 条评论
1 声望
0 粉丝
宣传栏