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窗口一样,没有任何信息返回,为什么呢?是我哪里操作错误了呢?
根据你的描述,问题可能出在几个方面。首先,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');
});
解释
- 创建服务器时传递回调函数:这样可以立即处理连接事件。
- 处理数据事件:当客户端发送数据时,读取并处理数据。
- 处理结束事件:当客户端断开连接时,输出日志。
- 处理错误事件:捕捉并处理任何错误。
- 广播消息:通过一个自定义事件
broadcast
来处理向所有连接的客户端广播消息的功能。
运行与测试
- 在一个 CMD 窗口中运行
node chat.js
。 - 在另一个 CMD 窗口中使用
telnet 127.0.0.1 9000
建立连接。 - 输入名字后,应该会看到欢迎消息和其他用户加入或离开的消息。
如果仍然遇到问题,可能是 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');
});
这段代码做了以下几点改动:
- 增强了欢迎消息:服务器在用户连接时会提示用户输入用户名。
- 增加了对
data
事件的监听:当接收到客户端发送的数据时,将显示一条欢迎消息给客户端。 - 添加了
end
事件的监听:当客户端断开连接时,服务器会输出一条日志。
为了测试这个新的 chat.js
脚本,你需要在两个 CMD 窗口中运行它:一个运行脚本,另一个使用 telnet
建立连接并发送用户名。这样,你应该可以看到服务器端返回的欢迎消息,表明服务器正确地处理了客户端的数据。