基于Node.js搭建TCP聊天服务器

  作者:zhanhailiang 日期:2014-11-23

原理:

  1. 服务器端维持所有的客户端连接列表;
  2. 当服务器收到某个客户端的消息时,将其广播给其它的客户端连接;
  3. 当某个客户端连接退出时,将其从客户端连接列表中剔除;

实现:

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

参考: 《Professional
Node.js》 Chapter10 Building TCP Server

时间: 2024-07-28 15:04:04

基于Node.js搭建TCP聊天服务器的相关文章

《基于Node.js实现简易聊天室系列之详细设计》

一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次不是很清楚,索性这一章将所有的过程(前后端以及数据库)做一个介绍,下一章写完总结就OK了吧. (1)前端部分 涉及到的技术:html.css.bootstrap.jquery.jquery UI 登录/注册界面使用的是bootstrap响应式布局,即支持不同尺寸的客户端,以此提高用户的体验.在这之前

《基于Node.js实现简易聊天室系列之引言》

简述:这个聊天室是基于Node.js实现的,完成了基本的实时通信功能.在此之前,对node.js和mongodb一无所知,但是通过翻阅博客,自己动手基本达到了预期的效果.技术,不应该是闭门造车,而是学会分享总结才能进步.因此,我想记录下我的学习心得.不喜勿喷. 技术选型: 数据库:mongodb 实时通信:socket.io 服务器:node.js 后台:node.js 前端js库:jquery 数据库之所以选择mongodb,是因为mongodb是介于关系型与非关系型之间的一款产品,存储格式为

基于Node.js搭建静态服务器

作者:zhanhailiang 日期:2014-11-23 原理: 通过解析请求url来解析到相应文件路径: 判断文件是否存在: 若存在,则读取文件内容输出: 实现: var path = require('path'), fs = require('fs');   require('http').createServer(function(req, res) { // 解析文件路径,默认以当前目录为根目录查找文件 // 这里可以通过配置root值来做为相对根目录查找文件 var file =

《基于Node.js实现简易聊天室系列之总结》

前前后后完成这个聊天室的Demo花了大概一个星期,当然一个星期是仅仅指编码的工作.前期的知识储备是从0到1从无到有,花费了一定的时间熟悉Node.js的基本语法以及Node.js和mongoDB之间的交互的过程.Demo中的重难点是socket.io的运行机制,从将socket.io绑定到服务器server上,到服务器和客户端双方都利用emit和on方法进行自定事件的处理.下面分别着重就上述几点进行讲解. Node.js Node.js创建服务器以及执行类似后台语言的操作.最近,也在接触C#,在

利用node.js搭建简单web服务器的方法教程

前言 使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 早先不使用web服务器的情况下想要在浏览器端访问本地资源,可以利用firefox浏览器,其可以自己启动一个小型web服务器. 为了让刚接触node的人也能大体看懂,本文的代码我将尽量简化. 准备 首先,

Node.js 搭建 https 协议 服务器

var https = require('https'); //创建服务器 https var fs = require('fs'); //文件系统的模块 const hostname = '127.0.0.1'; const port = 3000; var options = { key : fs.readFileSync('ssh_key.pem'), //读出 sytly 文件? cert : fs.readFileSync('ssh_cert.pem'), //同步读出 SSL 证书

基于Node.js + socket.io实现WebSocket的聊天DEMO

原文摘自我的前端博客,欢迎大家来访问 http://hacke2.github.io 简介 最近看Node.js和HTML5,练手了一个简易版的聊天DEMO,娱乐一下 为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一, 为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验, 于是socket.io诞生. 简答来说socket.io具体以下特点: 1.socket.io设计的目标是支持任何的浏览器

基于Node.js和express的日志服务器

首先,这篇文章学习的意义大于实际价值.如果按我的本意,直接在游戏中加入友盟,信息更全,而且非常简单.不过总是有很多人会凭着自己过时或者错误的经验去说别的东西多么不好,自己的东西多么好.好在,我自认为学习能力非常强,解决问题的能力也非常强.真让我做一个服务器+前端,也是在兴趣之中和能力之内. 一.Node.js简介 原本javascript纯粹是一个前端语言,干的基本上是让网页更丰富更炫的事情.不过Node.js出现后,javacript成为了前后端通吃的语言.比如网易的pomelo就是基于Nod

基于Node.js的文件下载服务器

首先表示,并不是我客户端玩腻歪了要玩跨界:另外,代码不是我写的,而是我找的. 直接上代码地址,不想看唠叨的就直接下载代码就ok了. https://github.com/andygrn/Node.js-File-Server 下载代码后,直接把server.js拖到node.exe图标上就可以运行了,在浏览器中访问http://127.0.0.1:80/可以直接连接下载服务器了. 1.为什么要关注下载服务器(文件服务器)? 因为我要写个多线程断点续传的下载库,当然要有一个服务器进行测试.用Apa