Nodejs 即学即用第二章的那个聊天示例(代码我也贴出来了),在XP上无法做出来呢?

Nodejs 即学即用第二章的那个聊天示例(代码我也贴出来了),在XP上无法做出来呢?

chat.js代码如下

var net = require('net');
var chatServer = net.createServer();

chatServer.on('connection', function(client) {
client.write('Hi\n');
client.end();
});
chatServer.listen(9000);

我先在一个CMD窗口运行node chat.js,然后用另一个CMD窗口建立telnet连接,运行以下命令

o 127.0.0.1 [9000]

然后提示我输入用户名和密码,我输入之后直接就进入了,然后就类似于刚刚打开的CMD窗口一样,没有任何信息返回,为什么呢?是我哪里操作错误了呢?


6 回复

根据你的描述,问题可能出在几个方面。首先,Node.js 在 Windows XP 上可能有一些兼容性问题,特别是涉及到网络通信的部分。其次,你的代码逻辑也有需要改进的地方。

改进后的 chat.js 代码

让我们先对 chat.js 进行一些修改,以确保它能够正确处理客户端连接,并且能够显示简单的消息:

var net = require('net');

var chatServer = net.createServer(function(client) {
    client.write("欢迎来到聊天室!请输入您的名字:");

    client.on('data', function(data) {
        var name = data.toString().trim();
        console.log(`${name} 加入了聊天室`);
        client.write(`你好,${name}! 欢迎你加入聊天室。\n`);

        // 广播新用户加入的消息给所有已连接的客户端
        chatServer.getConnections(function(err, count) {
            chatServer.emit('broadcast', `${name} 加入了聊天室`, count);
        });
    });

    client.on('end', function() {
        console.log('用户断开连接');
        chatServer.emit('broadcast', '有一位用户离开了聊天室');
    });

    client.on('error', function(err) {
        console.error('客户端发生错误:', err.message);
    });
});

// 处理广播消息
chatServer.on('broadcast', function(message, count) {
    chatServer.getConnections(function(err, connections) {
        if (err) throw err;

        for (var i = 0; i < connections; i++) {
            var client = chatServer.getConnection(i);
            if (client && client.writable) {
                client.write(message + '\n');
            }
        }
    });
});

chatServer.listen(9000, function() {
    console.log('聊天服务器正在监听端口 9000');
});

解释

  1. 创建服务器时传递回调函数:这样可以立即处理连接事件。
  2. 处理数据事件:当客户端发送数据时,读取并处理数据。
  3. 处理结束事件:当客户端断开连接时,输出日志。
  4. 处理错误事件:捕捉并处理任何错误。
  5. 广播消息:通过一个自定义事件 broadcast 来处理向所有连接的客户端广播消息的功能。

运行与测试

  1. 在一个 CMD 窗口中运行 node chat.js
  2. 在另一个 CMD 窗口中使用 telnet 127.0.0.1 9000 建立连接。
  3. 输入名字后,应该会看到欢迎消息和其他用户加入或离开的消息。

如果仍然遇到问题,可能是 Node.js 在 Windows XP 上的某些特性不被完全支持。考虑升级到更高版本的 Windows 或者使用 Docker 容器来运行 Node.js 应用。


为什么要client.end();

交互过程其实是一样的,各种系统的telnet实现有所差异,只是结果没正常显示而已。可以用wireshark抓包验证。

我的意思是你服务端先不要急着断开,看看会如何

我试过去掉client.end,不管用

从你的描述来看,问题可能出在客户端与服务器的交互上。你提到客户端在输入用户名和密码后没有得到任何反馈,这可能是因为服务器代码没有处理这些输入。让我们来修改一下 chat.js 文件,以便更好地处理客户端的连接、接收数据以及发送响应。

首先,你需要确保服务器能够接收客户端发来的数据,并作出相应的回应。以下是修改后的 chat.js 代码:

var net = require('net');

var chatServer = net.createServer(function(client) {
    client.write('Welcome to the chat server!\nPlease enter your username: ');

    client.on('data', function(data) {
        var message = data.toString().trim();
        client.write(`Hello ${message}! You've just connected to our chat server.\n`);
    });

    client.on('end', function() {
        console.log('Client disconnected');
    });
});

chatServer.listen(9000, '127.0.0.1', function() {
    console.log('Chat server is listening on port 9000');
});

这段代码做了以下几点改动:

  1. 增强了欢迎消息:服务器在用户连接时会提示用户输入用户名。
  2. 增加了对 data 事件的监听:当接收到客户端发送的数据时,将显示一条欢迎消息给客户端。
  3. 添加了 end 事件的监听:当客户端断开连接时,服务器会输出一条日志。

为了测试这个新的 chat.js 脚本,你需要在两个 CMD 窗口中运行它:一个运行脚本,另一个使用 telnet 建立连接并发送用户名。这样,你应该可以看到服务器端返回的欢迎消息,表明服务器正确地处理了客户端的数据。

回到顶部