用NodeJS创建一个聊天服务器
Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作。让我们用Node实现有多么简单,并且还能轻松扩展。
创建一个TCP服务器
var net = require('net');
var chatServer = net.createServer(); chatServer.on("connection", function(client) {
client.write('Hi!\n');
client.on('data', function(data) {
console.log(data); }); });
chatServer.listen(9000);
我们用Telnet 连接上localhost:9000,向服务器发送hi,Node显示出一堆二进制的数据,原来Javascript无法很好的处理的二进制数据,所以引入Buffer库来处理。
客户端互相发送消息
var net = require('net');
var chatServer = net.createServer();
clientList = [];
chatServer.on("connection", function(client) {
client.write('Hi!\n');
client.name = client.remoteAddress + ":" + client.remotePort;
client.write('Hi' + client.name + '\n');
clientList.push(client);
client.on('data', function(data) {
broadcast(data, client);
}); }); function broadcast(msg, client) {
for (var i = 0, clen = clientList.length; i < clen; i++) {
if (client !== clientList[i]) {
clientList[i].write(client.name + " says " + msg + "\n");
} }
}
chatServer.listen(9000);
当我们断开其中的一个客户端的话,服务器会报如下错误:
检查socket可写状态将程序变得更健壮
var net = require('net');
var chatServer = net.createServer();
clientList = [];
chatServer.on("connection", function(client) {
client.write('Hi!\n');
client.name = client.remoteAddress + ":" + client.remotePort;
client.write('Hi' + client.name + '\n');
clientList.push(client);
client.on('data', function(data) {
broadcast(data, client);
});
//客户端退出
client.on('end', function() {
console.log(client.name + " quit");
clientList.splice(clientList.indexOf(client), 1);
}); }); function broadcast(msg, client) {
var cleanup = [];
for (var i = 0, clen = clientList.length; i < clen; i++) {
if (client !== clientList[i]) {
//检查socket是否可写
if (clientList[i].writable) {
clientList[i].write(client.name + " says " + msg + "\n");
} else {
cleanup.push(clientList[i]);
clientList[i].destroy(); //对断开连接的socket进行销毁
}
}
}
//在写入循环中删除死节点,消除垃圾索引
for (var i = 0, clenuplen = cleanup.length; i < clenuplen; i++) {
clientList.splice(clientList.indexOf(cleanup[i]), 1);
}
}
chatServer.listen(9000);
记录错误日志
//记录错误日志
client.on('error', function(e) {
console.log(e);
})
为client对象添加error事件后,客户端发生的任何错误都会被记录下来。
用NodeJS创建一个聊天服务器的更多相关文章
- nodejs创建一个HTTP服务器 简单入门级
const http = require('http');//请求http.createServer(function(request, response){ /*createServer该函数 ...
- 十七、创建一个 WEB 服务器(一)
1.Node.js 创建的第一个应用 var http=require("http") http.createServer(function (req,res) { res.wri ...
- 【重点突破】——使用Express创建一个web服务器
一.引言 在自学node.js的过程中有一个非常重要的框架,那就是Express.它是一个基于NodeJs http模块而编写的高层模块,弥补http模块的繁琐和不方便,能够快速开发http服务器.这 ...
- Missian指南三:创建一个Missian服务器(使用spring)
在使用Missian时,spring是可选的,但是作者本人强烈推荐和Spring配合使用.Spring是一个伟大的项目,并且它不会对程序在运行时的效率带来任何损耗. Missian在服务器端依赖与Mi ...
- nodejs创建一个简单的web服务
这是一个突如其来的想法,毕竟做web服务的框架那么多,为什么要选择nodejs,因为玩前端时,偶尔想调用接口获取数据,而不想关注业务逻辑,只是想获取数据,使用java或者.net每次修改更新后还要打包 ...
- [git 学习篇]自己在github创建一个远程服务器创库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- NodeJs创建一个简单的服务器
步骤: 1 //模块化引入 2 let http = require ("http"); 3 4 //创建服务器 5 http.createServer(function(requ ...
- python web编程 创建一个web服务器
这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...
- Docker 使用入门,创建一个Nginx服务器
运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 dock ...
随机推荐
- WPF: 在 MVVM 设计中实现对 ListViewItem 双击事件的响应
ListView 控件最常用的事件是 SelectionChanged:如果采用 MVVM 模式来设计 WPF 应用,通常,我们可以使用行为(如 InvokeCommandAction)并结合命令来实 ...
- TCP/IP笔记(三)数据链路层
数据链路的作用 数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范.通信媒介包括双绞线电缆.同轴电缆.光纤.电波以及红外线等介质.此外,各个设备之间有时也会通过交换机.网桥.中继器等中转数据. ...
- 【Unity优化】如何实现Unity编辑器中的协程
Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...
- 【读书笔记】-- 你不知道的JavaScript
<你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...
- 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数
1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...
- 用Java实现将多级文件夹下的所有文件统一放到一个文件夹中
每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了 ...
- shell学习指南-阅读笔记
shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...
- Project下载提示检索 COM 类工厂中 CLSID 为 {36D27C48-A1E8-11D3-BA55-00C04F72F325} 的组件失败
做后台系统导出Project时,部署到服务器提示:检索 COM 类工厂中 CLSID 为 {36D27C48-A1E8-11D3-BA55-00C04F72F325} 的组件失败,原因是出现以下错误: ...
- 记录一次raid数据恢复及回迁成功的案例
故障发生在两块盘组成的一个raid0上,其中的一块盘亮黄灯,被raid卡踢出后,raid崩溃,下面就把当时抢救数据的整个过程进行介绍. 由于硬盘是两块SAS 300G的硬盘,先把硬盘从机器中拔出来,然 ...
- Best Time to Buy and Sell Stock系列
I题 Say you have an array for which the ith element is the price of a given stock on day i. If you we ...