搭建最简单的socket 服务端和客户端,这次的文章主要是明白net.socket的对象作为流是如何发挥作用的
net.socket官网描述是这样的
- 继承自: <stream.Duplex>
此类是 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);
})
关于流的介绍可以参考下面的文章
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。