1. 程式人生 > >websocket搭建的聊天室

websocket搭建的聊天室

說明 原理 example port adc type htm 消息 var

在前後端數據交互的時候我們經常使用的是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); //給每一個鏈接發送數據 }); }

有說的不對的歡迎大家吐槽,大家相互學習。

websocket搭建的聊天室