websocket搭建的聊天室

在前后端数据交互的时候我们经常使用的是ajax,用的是传统的http协议,而http协议有个致命的缺点,就是请求一结束,连接就断开了, 我们为了保持这个链接的,通常会使用cookie,而自从h5出现websocket之后,妈妈再也不用担心我的请求了,可以愉快的玩耍了,websocket是TCP协议,也就是所谓的“长连接”,可以一直保持,客户端与服务端的连接,交互起来自然是so easy ,to happy,这两天利用工作之余,写了一个基于nodejs和websocket的聊天室,只为说明原理,没有做任何的样式,不喜勿喷

 这是客户端:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<input type="text" id="input"/>
		<input type="button" value="发送" id="btn"/>
	</body>
	<script>
		var websocket = new WebSocket("ws://localhost:3000/");
		
		function showMessage(type,str){
			var div = document.createElement('div');
			div.innerHTML = str;
			
			if(type == 'enter'){
				div.style.color = 'blue';
			}else if(type == 'leave'){
				div.style.color = 'red';
			}
			document.body.appendChild(div);
			
		}
		websocket.onopen = function(){			//连接成功后的回调
			document.getElementById('btn').onclick = function(){
				var txt = document.getElementById('input').value;
				if(txt){
					websocket.send(txt);
				}
			}
		}
		websocket.onclose = function(){		//关闭连接的回调
											
		}
		websocket.onmessage = function(e){		//发送消息的回掉
			var msg = JSON.parse(e.data);
			showMessage(msg.type,msg.data);
		}
		
	</script>
</html>

 这是服务端:

var ws = require("nodejs-websocket")    //导入nodejs-websocket模块

var PORT = 3000;
var clientCount = 0;
// Scream server example: "hi" -> "HI!!!"
var server = ws.createServer(function (conn) {        //建立连接时
    console.log("New connection")
    clientCount++;
    conn.nickname = 'user'+clientCount;                //每一个用户名
    var msg = {};
    msg.type = "enter";        //消息的类型,
    msg.data = conn.nickname + '  进入了聊天室';    
    msg = JSON.stringify(msg);    //数据格式化
    broadcast(msg);        //用于广播数据
    
    console.log(msg);
    conn.on("text", function (str) {
        console.log("Received "+str)
        var msg = {};
        msg.type = 'message';
        msg.data = conn.nickname + ':' + str;
        msg = JSON.stringify(msg);
        broadcast(msg);
    })
    conn.on("close", function (code, reason) {        //链接关闭的回调,注意这个一定要写,否则在关闭页面的时候,服务会抛异常;
        console.log("Connection closed")
        var msg = {};
        msg.type = 'leave';
        msg.data = conn.nickname +'离开了';
        msg = JSON.stringify(msg);
        broadcast(msg);
        
    })
    conn.on("error", function (err) {    //出错时候的回调;
        console.log(err);
    })
}).listen(PORT);

function broadcast(str){
    server.connections.forEach(function(connection){    //遍历所有的链接
        connection.sendText(str);                        //给每一个链接发送数据
    });
}

有说的不对的欢迎大家吐槽,大家相互学习。

原文地址:https://www.cnblogs.com/chenzhiyu/p/8315501.html