在本文中,我们将深入探讨如何使用Node.js构建一个基于TCP的聊天程序,涵盖服务端和客户端的实现。Node.js是一个JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写应用程序,而net模块是Node.js内建的一个核心模块,专门用于处理TCP网络通信。
我们从服务端开始。在服务端,我们需要创建一个TCP服务器,这可以通过调用`net.createServer`完成。这个函数接收一个回调函数作为参数,该函数会在每次有新的客户端连接时被触发,即当`connection`事件发生时。回调函数的参数`conn`是一个`net.Socket`实例,用于处理与客户端的双向通信。
服务器维护两个关键变量:`count`记录当前已连接的客户端数量,以及`users`对象存储客户端的昵称和对应的`Socket`对象。每当有新的客户端连接,`count`递增,服务端向客户端发送欢迎消息,并提示输入昵称。
`conn.on('data', function (data) {})`监听`data`事件,这意味着当客户端发送数据时,此回调函数会被调用。在这里,我们检查是否已定义`nickname`,如果没有,说明客户端正在输入昵称。如果昵称已经被其他客户端使用,服务端会提示重新输入;否则,昵称会被添加到`users`对象中,并通知所有在线用户新成员的加入。
如果`nickname`已经存在,则客户端发送的消息被视为对话内容。服务器将消息广播给除了发送者之外的所有客户端。
`conn.on('close', function () {})`和`conn.on('error', function (err) {})`分别处理客户端断开连接和连接错误的情况。在`close`事件中,`nickname`从`users`对象中移除,`count`递减;在`error`事件中,打印出错误信息。
接下来,我们转向客户端。客户端使用`process.stdin`来获取用户的键盘输入。`process.stdin.resume()`启动标准输入流,使得可以读取键盘输入。`process.stdin.on('data', function(data) {})`监听`data`事件,当用户按下回车键时,输入内容会被发送到服务端。
客户端通过`client.write()`将键盘输入的数据写入TCP连接,从而将消息发送到服务器。这样,服务端接收到消息后,会广播给其他客户端,实现聊天功能。
总结一下,Node.js的TCP聊天程序利用`net`模块提供了创建服务器和客户端的能力。服务端通过`net.createServer`监听连接,处理用户输入并广播消息,客户端则通过`process.stdin`接收用户输入并发送到服务器。通过这样的设计,我们可以构建一个简单的多人实时聊天应用。