用node.js创建一个聊天服务器
1.node的安装,网上查看教程,很简单的。
2.全部代码如下:
//我们加载了 net 模块。这个模块包含了 Node 需要的所有 TCP 功能
var net = require('net')
var chatServer = net.createServer();
clientList = [];
// 链接事件在调用回调函数时,会传给我们新客户端所对应的TCP socket对象的引用。
chatServer.on('connection', function(client) {
//客户端的ip地址和客户端从服务器返回数据的TCP端口 9000
client.name = client.remoteAddress + ':' + client.remotePort
client.write('Hi ' + client.name + '!\n');
clientList.push(client);
// client.on事件监听器
client.on('data', function(data) {
broadcast(data, client);
});
// 问题:当一个客户端断开链接的时候,其他的客户端也会下线。
// 当一个客户端断开连接时,把它从客户端的列表中移除。
client.on('end', function() {
// indexOf()找到客户端在队列中的位置
// 下一个客户端再调用broadcast方法的时候,已经断开的客户端就不会出现在列表中
clientList.splice(clientList.indexOf(client), 1);
});
// 错误记录
client.on('error', function(e) {
console.log(e);
});
});
// 实现多个客户端链接到服务器,进行通信,添加到队列中。
// 改进版
function broadcast(message, client) {
for (var i = 0; i < clientList.length; i += 1) {
var cleanup = [];
if (client !== clientList[i]) {
// 把数据发送给客户端
// 打印出发送者的名字和内容,进行区分。
// 因为闭包绑定了每个client对象和相应的请求。
// 检查socket是否可写
if (clientList[i].writable) {
clientList[i].write(client.name + " says " + message);
} else {
cleanup.push(clientList[i]);
clientList[i].destroy();
}
}
}
// 在写入循环中删除死节点,清除索引垃圾
for (var i = 0; i < cleanup.length; i += 1) {
clientList.splice(clientList.indexOf(cleanup[i], 1));
}
};
//端口号
chatServer.listen(9000);
3.命令行操作
启动服务:![](https://images2017.cnblogs.com/blog/1114011/201709/1114011-20170915090546532-354101007.png)
![](https://images2017.cnblogs.com/blog/1114011/201709/1114011-20170915090546532-354101007.png)
多个客户端进行链接服务器:打开多了命令行窗口cmd;
链接服务器:
如果无法使用telnet不是内部或外部命令,百度可以解决,http://jingyan.baidu.com/article/7908e85c6ec355af491ad265.html
多个客户端通信的效果:![](https://images2017.cnblogs.com/blog/1114011/201709/1114011-20170915091218547-397361097.png)
仅供大家参考一下。
web前端开发