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


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


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

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

    var net = require('net')
    
    var chatServer = net.createServer()
    
    chatServer.on('connection',function(client){
    	client.write('connection~~~
    ')
    	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~~
    ')
    	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~
    ')
    	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 + "
    ")
    
    	//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')





  • 相关阅读:
    python写入csv文件中文乱码解决方案
    高质量代码有三要素:可读性、可维护性、可变更性
    CFile
    BMP格式图像的显示
    SAP BW 学习笔记(一)
    SAP BW 学习笔记(五)
    SAP BW 学习笔记(二)
    SAP BW 学习笔记(三)
    SAP BW 学习笔记(四)
    CRM 5.0 Marketing – BW integrated topics summary
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7095928.html
Copyright © 2020-2023  润新知