Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作。让我们用Node实现有多么简单,并且还能轻松扩展。

创建一个TCP服务器

  1. var net = require('net');
  2. var chatServer = net.createServer();
  3.  
  4. chatServer.on("connection", function(client) {
  5. client.write('Hi!\n');
  6. client.on('data', function(data) {
  7. console.log(data);
  8.  
  9. });
  10.  
  11. });
  12. chatServer.listen(9000);

我们用Telnet 连接上localhost:9000,向服务器发送hi,Node显示出一堆二进制的数据,原来Javascript无法很好的处理的二进制数据,所以引入Buffer库来处理。

客户端互相发送消息

  1. var net = require('net');
  2. var chatServer = net.createServer();
  3. clientList = [];
  4. chatServer.on("connection", function(client) {
  5. client.write('Hi!\n');
  6. client.name = client.remoteAddress + ":" + client.remotePort;
  7. client.write('Hi' + client.name + '\n');
  8. clientList.push(client);
  9. client.on('data', function(data) {
  10. broadcast(data, client);
  11. });
  12.  
  13. });
  14.  
  15. function broadcast(msg, client) {
  16. for (var i = 0, clen = clientList.length; i < clen; i++) {
  17. if (client !== clientList[i]) {
  18. clientList[i].write(client.name + " says " + msg + "\n");
  19. }
  20.  
  21. }
  22. }
  23. chatServer.listen(9000);

当我们断开其中的一个客户端的话,服务器会报如下错误:

检查socket可写状态将程序变得更健壮

  1. var net = require('net');
  2. var chatServer = net.createServer();
  3. clientList = [];
  4. chatServer.on("connection", function(client) {
  5. client.write('Hi!\n');
  6. client.name = client.remoteAddress + ":" + client.remotePort;
  7. client.write('Hi' + client.name + '\n');
  8. clientList.push(client);
  9. client.on('data', function(data) {
  10. broadcast(data, client);
  11. });
  12. //客户端退出
  13. client.on('end', function() {
  14. console.log(client.name + " quit");
  15. clientList.splice(clientList.indexOf(client), 1);
  16. });
  17.  
  18. });
  19.  
  20. function broadcast(msg, client) {
  21. var cleanup = [];
  22. for (var i = 0, clen = clientList.length; i < clen; i++) {
  23. if (client !== clientList[i]) {
  24. //检查socket是否可写
  25. if (clientList[i].writable) {
  26. clientList[i].write(client.name + " says " + msg + "\n");
  27. } else {
  28. cleanup.push(clientList[i]);
  29. clientList[i].destroy(); //对断开连接的socket进行销毁
  30. }
  31. }
  32. }
  33. //在写入循环中删除死节点,消除垃圾索引
  34. for (var i = 0, clenuplen = cleanup.length; i < clenuplen; i++) {
  35. clientList.splice(clientList.indexOf(cleanup[i]), 1);
  36. }
  37. }
  38. chatServer.listen(9000);

记录错误日志

  1. //记录错误日志
  2. client.on('error', function(e) {
  3. console.log(e);
  4. })

为client对象添加error事件后,客户端发生的任何错误都会被记录下来。

用NodeJS创建一个聊天服务器的更多相关文章

  1. nodejs创建一个HTTP服务器 简单入门级

    const http = require('http');//请求http.createServer(function(request, response){    /*createServer该函数 ...

  2. 十七、创建一个 WEB 服务器(一)

    1.Node.js 创建的第一个应用 var http=require("http") http.createServer(function (req,res) { res.wri ...

  3. 【重点突破】——使用Express创建一个web服务器

    一.引言 在自学node.js的过程中有一个非常重要的框架,那就是Express.它是一个基于NodeJs http模块而编写的高层模块,弥补http模块的繁琐和不方便,能够快速开发http服务器.这 ...

  4. Missian指南三:创建一个Missian服务器(使用spring)

    在使用Missian时,spring是可选的,但是作者本人强烈推荐和Spring配合使用.Spring是一个伟大的项目,并且它不会对程序在运行时的效率带来任何损耗. Missian在服务器端依赖与Mi ...

  5. nodejs创建一个简单的web服务

    这是一个突如其来的想法,毕竟做web服务的框架那么多,为什么要选择nodejs,因为玩前端时,偶尔想调用接口获取数据,而不想关注业务逻辑,只是想获取数据,使用java或者.net每次修改更新后还要打包 ...

  6. [git 学习篇]自己在github创建一个远程服务器创库

    现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...

  7. NodeJs创建一个简单的服务器

    步骤: 1 //模块化引入 2 let http = require ("http"); 3 4 //创建服务器 5 http.createServer(function(requ ...

  8. python web编程 创建一个web服务器

    这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...

  9. Docker 使用入门,创建一个Nginx服务器

    运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 dock ...

随机推荐

  1. 谷歌(Google Chrome)插件安装

    chrome应用商店打不开,安装插件的另一种方式 接下来以JsonView为例讲解安装步骤: 1.打开GitHub: https://github.com 2.搜索jsonview 3.选择需要的插件 ...

  2. Python--校园网爬虫记

    查成绩,算分数,每年的综合测评都是个固定的过程,作为软件开发者,这些过程当然可以交给代码去做,通过脚本进行网络请求获取数据,然后直接进行计算得到基础分直接填表就好了,查成绩再手动计算既容易出错也繁琐, ...

  3. 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)

    目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...

  4. 手把手教你怎么搭建angular+gulp的项目(一)

    大多时候,我们要学习一个新东西,不是不肯去学,而是不知道该如何开始.比如学angular,我要怎么开始学?怎么应用到自己项目中?这篇文章就是我根据自己边学习边应用,构建一个项目的切身体会,来讲下怎么开 ...

  5. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  6. windos环境apache+mysql+php+Discuz的安装配置

    首先是相关软件的下载:PHP.Apache和Mysql软件以及VC库.相关软件可到我的百度网盘下载,百度网盘:http://pan.baidu.com/s/1o6DYcMu 相关软件的直接下载地址: ...

  7. Tcl与Design Compiler (六)——基本的时序路径约束

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 时序约束可以很复杂,这 ...

  8. MCMC(一)蒙特卡罗方法

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链(待填坑) MCMC(三)M-H采样和Gibbs采样(待填坑) 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Ca ...

  9. IOS简单画板实现

    先上效果图 设计要求 1.画笔能设置大小.颜色 2.有清屏.撤销.橡皮擦.导入照片功能 3.能将绘好的画面保存到相册 实现思路 1.画笔的实现,我们可以通过监听用户的 平移手势 中创建 UIBezie ...

  10. 如何用Android Studio查看build.gradle源码

    上一篇博客里讲过 build.gradle 里的每一行代码基本都是在调用一个方法,既然是这样,我们就可以用 android studio(下面简称as) 去查看它源码的方法注释说明,这样就可以理解每个 ...