博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NodeJS]使用Node.js写一个简单的在线聊天室
阅读量:5819 次
发布时间:2019-06-18

本文共 2758 字,大约阅读时间需要 9 分钟。

声明:教程来自《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()		//servervar 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')// servervar chatServer = net.createServer()// clientsvar 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 clientfunction 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 portchatServer.listen(2333)//log the console.log('Server is running')

转载于:https://www.cnblogs.com/gavanwanggw/p/7095928.html

你可能感兴趣的文章
关于自学机器学习的思考?提醒自己这6件事
查看>>
4-7
查看>>
Hexo 及 NexT 基本配置与使用
查看>>
2019税改有哪些变化?什么是专项扣除?这些改动与你的工资息息相关!
查看>>
利用枚举类实现单例模式
查看>>
Ansible学习笔记——基础与配置
查看>>
Python学习教程(Python学习路线):干货面试题(三)
查看>>
Android的消息机制分析
查看>>
lc198. House Robber
查看>>
精简讨论Javascript 中的 this 问题
查看>>
关于文件上传那些可能不怎么对的姿势
查看>>
彻底理解Java中的基本数据类型转换(自动、强制、提升)
查看>>
【接口管理】eoLinker-AMS开源版JAVA版本正式发布
查看>>
CSS3(一)
查看>>
Remove Nth Node From End of List
查看>>
vue引入axios同源跨域
查看>>
获取音视频文件AVMetadata数据
查看>>
Dubbo 的流量防卫兵|Sentinel如何通过限流实现服务的高可用性
查看>>
内容分类扩展性标签设计
查看>>
Js 判断字符串是否含有某个字符
查看>>