声明:教程来自《Node即学即用》。源代码案例均出自此书。博文仅为个人学习笔记。

第一步:创建一个聊天server。

首先,我们先来写一个Server:

var net = require('net')

var chatServer = net.createServer()

chatServer.on('connection',function(client){
client.write('connection~~~\n')
client.end()
}) chatServer.listen(2333) console.log('Server')

能够使用telnet命令訪问server:

第二步:监听全部的连接请求

server源代码:

var net = require('net')

var chatServer = net.createServer()

chatServer.on('connection',function(client){
client.write('Hello~~\n')
client.on('data',function(data){
console.log(data);
})
}) chatServer.listen(2333) console.log('Server')

这里加入了一个事件监听器client.on(),每当client发送data的时候这个函数都会被调用。

所以如今不论发送什么数据,server都会显示出来:

可是这里有个问题:返回的内容均为乱码,由于JS不能非常好的处理二进制数据。所以Node添加了一个buffer库来帮助server。

打印的字符实际上是16进制的字节数据,能够保持二进制的格式,由于TCP和Telnet都能处理它们。

第三步:客户端之间的通信:

var net = require('net')

var chatServer = net.createServer()		//server
var clientList = [] //客户端数组 chatServer.on('connection',function(client){
client.write('Hello~Client~\n')
clientList.push(client)
client.on('data',function(data){
for (var i = 0; i < clientList.length; i++) {
clientList[i].write(data)
};
})
}) chatServer.listen(2333) console.log('Server')

这个就是一个最简单的聊天server了,能够打开多个终端,输入telnet localhost 2333訪问server。

下一步。改进消息发送和显示的方式,让页面更友善一些。

我们把IP和端口号拼接作为username,这样能够看出来是谁发了消息。

同一时候我们还须要加上异常的处理。由于在前面的程序中。假设有些客户端退出并没有在server的clientlist中移除。

改善后的完整版本号例如以下:

/*
* A chat online server
*/ var net = require('net') // server
var chatServer = net.createServer() // clients
var clientList = [] chatServer.on('connection',function(client){
/*
//name = ip + port
client.name = client.remoteAddress + ":" + client.remotePort
*/
client.name = "No." + client.remotePort
client.write('Hello~ ' + client.name + "\n") //add the client to list
clientList.push(client) //push clients to arraylist //when get data
client.on('data',function(data){
broadcast(data,client)
}) //when data end
client.on('end',function(){
clientList.splice(clientList.indexOf(client),1)
}) //when get error
client.on('error',function(e){
console.log(e)
})
}) //broadcast the message to the client
function broadcast(message,client){
//the clients to delete
var cleanup = [] //check clients in clientlist
for (var i = 0; i < clientList.length; i++) {
if(client != clientList[i]){
if (clientList[i].writable) {
//write message if writable
clientList[i].write(client.name + " says " + message)
}else{
//add to cleanup list and destroy if not writable
cleanup.push(clientList[i])
clientList[i].destroy()
}
}
} //remove the clients in clientlist according to the cleanup list
for (var i = 0; i < cleanup.length; i++) {
clientList.splice(clientList.indexOf(cleanup[i]),1)
};
} //listen to 2333 port
chatServer.listen(2333) //log the
console.log('Server is running')

[NodeJS]使用Node.js写一个简单的在线聊天室的更多相关文章

  1. 用node.js写一个简单爬虫,并将数据导出为 excel 文件

    引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...

  2. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  3. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  4. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  5. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  6. 使用 Node.js 写一个代码生成器

    背景 第一次接触代码生成器用的是动软代码生成器,数据库设计好之后,一键生成后端 curd代码.之后也用过 CodeSmith , T4.目前市面上也有很多优秀的代码生成器,而且大部分都提供可视化界面操 ...

  7. JS写一个简单日历

    JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  8. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

  9. 使用WebSocket实现简单的在线聊天室

    前言:我自已在网上找好了好多 WebSocket 制作 在线聊天室的案列,发现大佬们写得太高深了 我这种新手看不懂,所以就自已尝试写了一个在线简易聊天室 (我只用了js 可以用jq ) 话不多说,直接 ...

随机推荐

  1. springboot配置过滤器和拦截器

    import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Http ...

  2. go-swagger的简单使用

    一.下载go-swagger go-swagger 官方下载 根据不同个的操作系统选择对应的 二.添加环境变量 2.1 window swagger_windows_amd64.exe 将swagge ...

  3. 【BZOJ4590】自动刷题机

    [思路分析] 比赛的时候想到了用二分+贪心,二分的部分与贪心的部分也写对了,但是由于数据范围未看没有开long long,且二分左端点赋值过小导致WA掉 正解:二分+贪心 二分代码的长度,贪心判断能否 ...

  4. 2015 多校赛 第三场 1002 (hdu 5317)

    Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...

  5. 5.17领扣--Arrays.copyOf()方法

    ?? 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同 ...

  6. css样式变 及实际用法

    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...

  7. 【转载】JavaScript中同名标识符优先级-Snandy

    一,局部变量先使用后声明,不影响外部同名变量 var x = 1; // --> 外部变量x function fn(){ alert(x); // --> undefined 局部变量x ...

  8. Centos 自动删除日志文件的Shell代码

    #!/bin/bash # #判断文件夹内文件的大小,如果大于一定的数值,那么删除 # echo '判断文件夹内文件的大小,如果大于一定的数值,并且文件名称包含数字(年月日)的删除,那么删除' pat ...

  9. Mysql Workbench 执行sql语句删除数据时提示error code 1175

    error code 1175是因为有安全模式限制 执行命令SET SQL_SAFE_UPDATES = 0;之后可以进行操作

  10. 团体程序设计天梯赛-练习集-L1-034. 点赞

    L1-034. 点赞 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持 ...