基于Node.js搭建TCP聊天服务器
作者:zhanhailiang 日期:2014-11-23
原理:
-
服务器端维持所有的客户端连接列表;
-
当服务器收到某个客户端的消息时,将其广播给其它的客户端连接;
-
当某个客户端连接退出时,将其从客户端连接列表中剔除;
实现:
var net = require(‘net‘); var server = net.createServer(); var sockets = []; // accept connection server.on(‘connection‘, function(socket) { console.log(‘got a new connection‘); // 记录当前连接用户 sockets.push(socket); // 当收到客户端消息时将其广播给其它所有连接用户 socket.on(‘data‘, function(data) { console.log(‘got data:‘, data); var index = sockets.indexOf(socket); sockets.forEach(function(otherSocket) { if (otherSocket !== socket) { otherSocket.write(new Buffer(index + ‘ say:‘)); otherSocket.write(data); } }); }); // 删除掉线或主动退出的用户连接 socket.on(‘close‘, function() { console.log(‘connection closed‘); var index = sockets.indexOf(socket); sockets.splice(index, 1); }); }); server.on(‘error‘, function(err) { console.log(‘Server error:‘, err.message); }); server.on(‘close‘, function() { console.log(‘Server closed‘); }); server.listen(4001);
完整代码请见: https://github.com/billfeller/professional-nodejs/blob/master/chapter10/chat_server.js
启动服务器:
[root@~/wade/nodejs/professional-nodejs/chapter10]# node chat_server.js got a new connection got a new connection got a new connection got data: <Buffer 77 68 61 74 20 69 73 20 79 6f 75 72 20 6e 61 6d 65 0d 0a> got data: <Buffer 69 20 61 6d 20 62 69 6c 6c 0d 0a> got data: <Buffer 69 20 61 6d 20 66 65 6c 6c 65 72 0d 0a> got data: <Buffer 69 20 61 6d 20 7a 75 63 6b 2c 20 6e 69 63 65 20 74 6f 20 6d 65 65 74 20 79 6f 75 0d 0a> got data: <Buffer 6d 65 0d 0a> got data: <Buffer 6d 65 0d 0a> got data: <Buffer 74 6f 6f 0d 0a>
按顺序启动三个客户端连接,开始聊天:
[root@~]# telnet 127.0.0.1 4001 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is ‘^]‘. what is your name 1 say:i am bill 2 say:i am feller i am zuck, nice to meet you 1 say:me 2 say:me 2 say:too
[root@~]# telnet 127.0.0.1 4001 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is ‘^]‘. 0 say:what is your name i am bill 2 say:i am feller 0 say:i am zuck, nice to meet you me 2 say:me 2 say:too
[root@~]# telnet 127.0.0.1 4001 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is ‘^]‘. 0 say:what is your name 1 say:i am bill i am feller 0 say:i am zuck, nice to meet you 1 say:me me too
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。