关于Nodejs net监听与收发的问题

关于Nodejs net监听与收发的问题

请问如果我要实现这样的功能应该如何做:

  • server监听client,然后就这样放着。
  • server可以主动地(比如post来了数据然后让server发消息)去向client发送一些信息并且等待client返回信息。
  • client接受了server的消息后运行一些程序然后将结果反馈给server。

跪求啊T_T

5 回复

当然可以!下面是关于如何使用 Node.js 的 net 模块来实现服务器(Server)监听客户端(Client),以及服务器能够主动向客户端发送消息并等待客户端反馈的详细解答。

示例代码

首先,我们需要创建一个服务器端和一个客户端。服务器会监听客户端的连接,并且能够主动发送消息给客户端,同时接收客户端的反馈。客户端在接受到消息后,会执行某些操作并反馈给服务器。

服务器端代码 (server.js)

const net = require('net');

// 创建一个TCP服务器
const server = net.createServer((socket) => {
    console.log('Client connected.');

    // 监听客户端的消息
    socket.on('data', (data) => {
        console.log(`Received from client: ${data.toString()}`);
    });

    // 主动发送消息给客户端
    setInterval(() => {
        const message = 'Hello from server!';
        console.log(`Sending to client: ${message}`);
        socket.write(message);
    }, 5000);  // 每隔5秒发送一次消息
});

// 监听错误
server.on('error', (err) => {
    console.error(`Server error: ${err.message}`);
});

// 绑定端口并开始监听
server.listen(3000, () => {
    console.log('Server listening on port 3000');
});

客户端代码 (client.js)

const net = require('net');

// 创建一个TCP客户端
const client = new net.Socket();

// 连接到服务器
client.connect(3000, '127.0.0.1', () => {
    console.log('Connected to server.');
});

// 监听服务器的消息
client.on('data', (data) => {
    console.log(`Received from server: ${data.toString()}`);
    // 执行某些操作
    const response = 'Response from client';
    client.write(response);
});

// 监听错误
client.on('error', (err) => {
    console.error(`Client error: ${err.message}`);
});

// 关闭连接
client.on('close', () => {
    console.log('Connection closed');
});

解释

  1. 服务器端 (server.js):

    • 使用 net.createServer() 创建一个TCP服务器。
    • 当有客户端连接时,触发回调函数,在其中设置事件监听器来处理客户端的数据和错误。
    • 使用 setInterval 每隔一段时间主动向客户端发送消息。
  2. 客户端 (client.js):

    • 使用 net.Socket() 创建一个TCP客户端。
    • 使用 client.connect() 连接到服务器。
    • 设置事件监听器来处理从服务器接收到的消息,并在接收到消息后向服务器发送反馈。

通过这种方式,服务器可以主动向客户端发送消息,并等待客户端的响应。


比如说

var net = require('net');
var server = net.createServer(function(sock) {
});

这样。。 然后我在express里面有:

app.post('/submit', function(req, res) {
	//我想在这里向client发送data。。
});

跪求如何做到。。

要看你的client是啥,是ios就好办啦

那就用消息队列呗

  • 一个是用类似zmq这样的 具体你需要自己研究
  • 另一个就是resque这样基于redis来实现通知客户端的需求,然后自己用http实现req/res的功能,服务器通过redis通知客户端 然后客户端掉用服务器的http api,我自己偏向于后者,因为http的社区比net丰富得多。

为了实现您描述的功能,我们可以使用Node.js的net模块来创建一个简单的TCP服务器和客户端。下面我将分别展示如何创建一个服务器(server)和客户端(client),并演示如何进行消息的收发。

1. 创建TCP服务器

首先,我们需要创建一个TCP服务器,它将监听客户端连接,并能够主动发送消息给客户端以及接收来自客户端的响应。

const net = require('net');

// 创建TCP服务器
const server = net.createServer((socket) => {
    console.log('Client connected.');

    // 接收客户端消息
    socket.on('data', (data) => {
        console.log(`Received from client: ${data.toString()}`);
        // 处理接收到的数据,比如这里只是简单打印出来
        // 可以根据需求添加处理逻辑
    });

    // 主动向客户端发送消息
    const messageToClient = 'Hello, Client!';
    socket.write(messageToClient);

    // 接收客户端的响应
    socket.on('end', () => {
        console.log('Client disconnected.');
    });
});

server.listen(3000, () => {
    console.log('Server is listening on port 3000');
});

2. 创建TCP客户端

接下来,我们创建一个TCP客户端,该客户端将连接到服务器,并在接收到消息后向服务器发送响应。

const net = require('net');

// 创建TCP客户端
const client = new net.Socket();

client.connect(3000, 'localhost', () => {
    console.log('Connected to server.');
    
    // 接收来自服务器的消息
    client.on('data', (data) => {
        console.log(`Received from server: ${data.toString()}`);
        
        // 向服务器发送响应
        const responseToServer = 'Message received by client';
        client.write(responseToServer);
    });

    // 客户端结束连接时
    client.on('close', () => {
        console.log('Disconnected from server.');
    });
});

// 可以在这里发送初始消息给服务器,或者等待服务器消息

总结

以上代码展示了如何使用Node.js的net模块来创建一个基本的TCP服务器和客户端。服务器可以监听客户端的连接,主动发送消息,并接收响应。客户端可以连接到服务器,接收消息并发送响应。根据实际需求,您可以在此基础上增加更复杂的逻辑和错误处理。

回到顶部