nodejs的cs模式聊天客户端和服务器实现
学习完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模式聊天客户端和服务器实现的更多相关文章
- CS模式,客户端页面加载
public MainForm() { //1.初始化视图 InitializeComponent(); //2.加载程序 this.Load += new System.EventHandler(t ...
- cs模式与bs模式
关于CS(Client-Server)模式和BS(Browser-Server)模式的水很深,盆地自己也认为对此了解不够透彻,但作为手机客户端设计,如果不对CS.BS做一定程度的了解,是很容易出现一 ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- 重构 JAVA 聊天室 —— CS 模式的简单架构实现
前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...
- 看完这篇包你进大厂,实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。
一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇文章,授人予鱼不如授人以渔嘛(这句话是这么说的吧),顺便赚点应届学生MM的膜拜那就 ...
- 聊天室(C++客户端+Pyhton服务器)2.基本功能添加
根据之前的框架添加新的功能 登录 点击相关按钮 // 登录按钮的响应void CMainDialog::OnBnClickedLogin(){ // 1. 获取用户输入的数据 UpdateData(T ...
- 聊天室(C++客户端+Pyhton服务器)_1.框架搭设
聊天室 一.客户端发送 用MFC可视化做个客户端登录界面. 先点击注册账号按钮,注册账号的时候就需要连接到服务器, 服务器需要查数据库,并做出相应的回应. 所以开始写C++客户端套接口类用来连接到服务 ...
- HTTP Keep-Alive模式客户端与服务器如何判定传输完成
目录 长连接是什么 服务器如何知道已经完全接受客户端发送的数据 客户端如何知道已经完全接受服务端发送的数据 Transfer-Encoding transfer-coding与Content-Leng ...
- SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub
SignalR 将整个交换信息的行为封装得非常漂亮,客户端和服务器全部都使用 JSON 来沟通,在服务器端声明的所有 hub 的信息,都会一般生成 JavaScript 输出到客户端. 它是基于浏览器 ...
随机推荐
- Quartz管理类
package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...
- 升级SUSE Linux内核的完整步骤!
http://blog.sina.com.cn/s/blog_491529d60100061h.html 安装完SLED 10后发现仍然有“热启动网络不通”的问题,原因是内核版本较低,于是升级到2.6 ...
- RefernceError : jQuery is not define
使用ligerUI 的时候,代码没有什么错误,可是不能正常显示组件 ,火狐debug显演示样例如以下错误: 最后发现是引入文件的顺序错了,最好依照ligerui demo中的顺序引入js文件,这样就不 ...
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...
- 0 Explore TreeView
尽可能接近WINDOWS 8的资源管理器效果(这里只模仿它的效果,处理文件功能不包括在内) TREEVIEW可以增加空白并且空白处不能单击 重绘三角箭头 重绘选中时的边框和填充色 重绘失去焦点时选 ...
- iOS开发——数据持久化Swift篇&模型对象归档
模型对象归档 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- C#数据采集类
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- Day03 - Python 函数
1. 函数简介 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print():也可以自己创建函数,这 ...
- C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理
1.Asp.net中建立Microsoft.Office.Interop.Word.Application时出现 “ 拒绝访问 ” 错误 项目中要实现在服务器端打开一个Word模版文件,修改其内容后再 ...