学习完nodejs的基础后,自然要写点东西练练手,以下是一个基于nodejs的cs模式的聊天软件代码:

net模块是nodejs的网络编程必定用到的一个模块,对socket通信进行了封装

实现的功能:客户端和服务器通过终端输入的方式,能够互相发送接收数据,并且服务器下发的数据所有的客户端都能收到,客户端能正常断开连接,不会影响到服务器。

服务器端代码:

var net = require("net");

/* 客户端的socket连接列表数组,最多保存1000个端 */

var socketList = new Array(1000);

/* 当前最大连接的数量,记个水平线,提高遍历效率 */

var nMaxCount = 0;

var port = 9999;

var ip = "127.0.0.1";

var server = net.createServer();

/* 监听端口和ip */

server.listen(port, ip);

/* 有客户端连接上时会触发 */

server.on("connection", function(socket){

/* 输出连接的ip */

console.log(socket.remoteAddress + " connected to server");

/* 发送一个hello给连接上来的客户端 */

socket.write("hello");

/* 加入连接列表中 */

var nIndex = 0;

for(; nIndex < nMaxCount; nIndex++){

if(socketList[nIndex] == 0){

socketList[nIndex] = socket;

break;

}

}

if(nIndex >= nMaxCount && nMaxCount < 1000){

socketList[nMaxCount] = socket;

nMaxCount++;

}

/* 监听数据 */

socket.on("data", function(data){

/* 标准输出接收到的数据 */

process.stdout.write(data);

});

/* 监听到客户端断开连接 */

socket.on("error", function(err){

console.log("error msg: " + err);

/* 移除该连接 */

for(var i = 0; i < nMaxCount; i++){

if(socketList[i] == socket){

socketList[i] = 0;

socket.end();

break;

}

}

});

});

/* 打开标准输入流 */

process.stdin.resume();

/* 将终端输入的数据发送给每一个连接上的客户端 */

process.stdin.on("data", function(data){

for(var i = 0; i < nMaxCount; i++){

if(socketList[i] != 0){

socketList[i].write(data);

}

}

});

客户端代码:

var net = require("net");

var port = 9999;

var ip = "127.0.0.1";

/* 创建连接到服务器的socket  */

var socketClient = net.createConnection(port, ip, function(socket){   console.log("connected"); });

/* 客户端收到服务器发送数据 */

socketClient.on("data", function(data){   process.stdout.write(data); });

socketClient.on("error", function(error){

console.log("error msg: " + error);

socketClient.destroy();

});

socketClient.on("close", function(){

console.log("server closed");   process.exit(1);

});

/* 打开标准输入 */

process.stdin.resume();

/* 将终端输入数据发送给服务器 */

process.stdin.on("data", function(data){

socketClient.write(data);

});

/* 客户端退出 */

process.on("exit", function(){

process.stdout.write("client exit\r\n");

});

/* 按下ctrl+c 组合键退出的时候,发送退出事件 */

process.on("SIGINT", function(){

process.exit(1);

});

以上算是对nodejs的socket通信的一个练习吧,先写到这吧。

nodejs的cs模式聊天客户端和服务器实现的更多相关文章

  1. CS模式,客户端页面加载

    public MainForm() { //1.初始化视图 InitializeComponent(); //2.加载程序 this.Load += new System.EventHandler(t ...

  2. cs模式与bs模式

     关于CS(Client-Server)模式和BS(Browser-Server)模式的水很深,盆地自己也认为对此了解不够透彻,但作为手机客户端设计,如果不对CS.BS做一定程度的了解,是很容易出现一 ...

  3. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  4. 重构 JAVA 聊天室 —— CS 模式的简单架构实现

    前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...

  5. 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。

    一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...

  6. 聊天室(C++客户端+Pyhton服务器)2.基本功能添加

    根据之前的框架添加新的功能 登录 点击相关按钮 // 登录按钮的响应void CMainDialog::OnBnClickedLogin(){ // 1. 获取用户输入的数据 UpdateData(T ...

  7. 聊天室(C++客户端+Pyhton服务器)_1.框架搭设

    聊天室 一.客户端发送 用MFC可视化做个客户端登录界面. 先点击注册账号按钮,注册账号的时候就需要连接到服务器, 服务器需要查数据库,并做出相应的回应. 所以开始写C++客户端套接口类用来连接到服务 ...

  8. HTTP Keep-Alive模式客户端与服务器如何判定传输完成

    目录 长连接是什么 服务器如何知道已经完全接受客户端发送的数据 客户端如何知道已经完全接受服务端发送的数据 Transfer-Encoding transfer-coding与Content-Leng ...

  9. SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub

    SignalR 将整个交换信息的行为封装得非常漂亮,客户端和服务器全部都使用 JSON 来沟通,在服务器端声明的所有 hub 的信息,都会一般生成 JavaScript 输出到客户端. 它是基于浏览器 ...

随机推荐

  1. Postgresql:prepared statement "S_1" already exists

    近期由于业务需要和一些json的存储查询需要,把新的应用切到pgsql上来,刚刚切好,是可以正常使用的,但是偶尔会来一下 java连接pgsql 偶尔出现 这个错.   org.postgresql. ...

  2. Linux安装JDK详细步骤

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...

  3. PowerShell中的数学计算

    Double类型和float都属于浮点类型,精度不高.而Decimal属于高精度

  4. android常见错误--INSTALL_FAILED_DEXOPT

    出现上面的问题,是由于手机的内存不足导致的,需要清理一下手机的内存,然后就可以了

  5. js replace如何实现全部替换

    js中replace默认只替换第一个相关字符,要想实现替换全部相关字符.如下: replace(/*/g, ','); 例如,替换字符串中的\n str.replace(/\n/g, ',');

  6. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...

  7. Android提供的系统服务之--TelephonyManager(电话管理器)

    Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...

  8. 第一个js程序

    <html><head> <title>Untitled</title> <script >function demo(){ alert ( ...

  9. iOS 中使用.9图

    背景 .9图来源于Android.为了设计出一套图,兼容Android和iOS,使用.9图的方式来对图片进行拉伸以适应不同的屏幕.在iOS中没有.9图的概念,只能先了解Android的.9图再进行模拟 ...

  10. java.lang.SecurityException: Permission denied (missing INTERNET permission?) 解决

    Android app里试图用HttpUrlConnection获取网络连接,忘记在AndroidManifest清单文件里声明需要用到Internet的权限,运行时报此错误. 解决方法 在Andro ...