让我为你介绍一下“学习 NodeJS 第八天:Socket 通讯实例”的完整攻略。
简介
本文将介绍 Socket 通讯实例以及如何使用 Socket 建立通信。
Socket 通讯实例
建立 Socket 服务器
要建立一个 Socket 服务器,你需要使用 net
模块。下面是一些示例代码:
const net = require('net');
const server = net.createServer((socket) => {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
server.listen(8000, '127.0.0.1');
在以上示例中,我们使用 createServer
方法创建了一个服务器实例,该方法返回 net.Server
实例。当一个新的客户端连接到服务器时,服务器会调用传递给 createServer
方法的回调函数。在本例中,我们简单地把接收到的所有消息发送回客户端。
建立 Socket 客户端
要建立一个 Socket 客户端,你可以使用 net
模块的 connect
方法。下面是一些示例代码:
const net = require('net');
const client = net.connect({ port: 8000 }, () => {
console.log('connected to server!');
client.write('world!\r\n');
});
client.on('data', (data) => {
console.log(data.toString());
client.end();
});
client.on('end', () => {
console.log('disconnected from server');
});
在以上示例中,我们使用 connect
方法连接到服务器,并发送一些数据。当数据发送成功后,服务器会将相应的数据发送回客户端并触发 data
事件。在 data
事件处理函数中,我们简单地打印服务器发送回的消息,然后关闭连接。
示例说明
下面是两个使用 Socket 进行通讯的示例说明:
示例一
一个简单的匿名聊天室,允许多个用户通过 Socket 进行互相交流。
服务器端
const net = require('net');
const server = net.createServer();
server.on('connection', handleConnection);
server.listen(9000, () => {
console.log('server listening to %j', server.address());
});
function handleConnection(conn) {
const remoteAddr = conn.remoteAddress + ':' + conn.remotePort;
console.log('new client connection from %s', remoteAddr);
conn.setEncoding('utf8');
conn.on('data', onConnData);
conn.once('close', onConnClose);
conn.on('error', onConnError);
function onConnData(data) {
console.log('connection data from %s: %j', remoteAddr, data);
server.getConnections((err, count) => {
broadcast(`${remoteAddr} says: ${data}`, conn);
console.log('%d connections currently open', count);
});
}
function onConnClose() {
console.log('connection from %s closed', remoteAddr);
server.getConnections((err, count) => {
console.log('%d connections currently open', count);
});
}
function onConnError(err) {
console.log('connection %s error: %s', remoteAddr, err.message);
}
}
function broadcast(message, conn) {
server.clients.forEach((client) => {
if (client !== conn) {
client.write(message);
}
});
}
以上示例代码中,我们使用 createServer
创建了一个服务器实例,并监听 connection
事件。当一个新的客户端连接到服务器时,回调函数 handleConnection
将被调用。
在 handleConnection
函数中,我们记录下客户端的远程地址,并将该连接的编码格式设置为 utf8。
然后,我们监听该连接的 data
事件,当事件发生时,我们将发送来的消息打印在控制台上,然后将它广播给其他连接。广播使用 broadcast
函数实现。
最后,当连接断开时,我们调用 onConnClose
函数,打印相关的日志。在打印完日志后,我们检查当前有多少打开的连接,以便于系统运维。
客户端
const net = require('net');
const client = net.connect({ port: 9000 }, () => {
console.log('connected to server!');
});
client.setEncoding('utf8');
client.on('data', (data) => {
console.log(data);
});
client.on('end', () => {
console.log('disconnected from server');
});
process.stdin.on('data', (data) => {
client.write(data);
});
以上示例代码中,我们使用 net.connect
方法连接到服务器。一旦连接成功,我们记录下该事件,并获取控制台的输入。在每次按下回车键时,用户输入会被发送到服务器。
示例二
一个流量转发程序,允许将数据从一个端口流转发到另一个端口。
服务器端
const net = require('net');
const server = net.createServer((from) => {
const to = net.connect(8000, 'localhost');
from.pipe(to);
to.pipe(from);
});
server.listen(9000, () => {
console.log('server listening on %j', server.address());
});
以上代码实现了一个端口转发程序。当一个客户端连接到该服务器时,当前连接的数据将被立即发送到本地 8000 端口上。该端口上运行的程序将对数据进行处理,然后将回应发送回当前连接。所有的回应数据将通过当前连接被转发回客户端。
客户端
const net = require('net');
const client = net.connect(9000, () => {
console.log('client connected');
});
client.pipe(process.stdout);
process.stdin.pipe(client);
以上代码实现了一个客户端,用于连接到转发服务,客户端向服务器发送数据,并将服务器回复打印到控制台上。
章节总结
本文介绍了 Socket 的基本概念以及如何使用 Node.js 构建一个 Node Socket 服务器。我们还通过两个示例代码,演示了如何使用 Socket 进行通讯。希望本文内容对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习 NodeJS 第八天:Socket 通讯实例 - Python技术站