声明:教程来自《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')