[NodeJS]使用Node.js写一个简单的在线聊天室

Posted gavanwanggw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NodeJS]使用Node.js写一个简单的在线聊天室相关的知识,希望对你有一定的参考价值。

声明:教程来自《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写一个简单的在线聊天室的主要内容,如果未能解决你的问题,请参考以下文章

原生nodejs编写在线聊天系统

使用nodejs写接口

Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

前端开发写一个node.js接口

Nodejs 文档概览

一文带你认识 NodeJs