代碼地址以下:
http://www.demodashi.com/demo/11579.htmljavascript
首先展現demo的結果界面,只是簡單消息的發送和接收,包括髮送文字和發送圖片。
css
在介紹socket.io以前,先簡單介紹一下websocket:html
Web Socket的目標是在一個單獨的持久鏈接上提供全雙工,雙向通訊java
在JavaScript中創建了Web Socket以後,會有一個HTTP請求發送到瀏覽器以發送鏈接。取得服務器響應以後,創建的鏈接會使用HTTP升級從HTTP協議交換爲WebSocket協議。WebSocket使用了自定義的協議,因此URL模式略有不一樣,未加密的是ws://,加密的是wss://,使用WebSocket的好處在於:能夠在客戶端和服務器端發送少許數據,減小開銷,且因爲全雙工通訊,適合即時應用。可是目前還達不到瀏覽器徹底兼容。node
Socket.IO官網
官網列出了Socket.IO的四大優勢:web
文檔合併:容許多個用戶同時編輯一個文檔,而且可以看到每一個用戶作出的修改。
Socket.IO對於支持ws的瀏覽器將採用ws通訊,對於不支持ws的將採用輪詢方式,因此Socket.IO是一個很是適合作即時通信的類庫。ajax
<script src="/javascripts/socket.io.js"></script> <script>var socket = io.connect();</script>
express(~4.13.1)
,將引用模塊命名爲io//引入模塊 var server = app.listen(3000,function(){ console.log('Express.js server listening on port'+ app.get('port'));}); var io = require('socket.io').listen(server); //io使用 io.on('connection', function (socket) {})
io.on('connection',function(socket){});//創建鏈接 io.sockets.emit(約定參數,data);//向全體人員廣播 io.emit(約定參數, data);//向全體人員廣播 socket.emit(約定參數,data)//發送信息 socket.on(約定參數,callback);//接收信息 socket.on('disconnect',callback);//用戶斷開鏈接觸發事件
Socket.IO對於每個鏈接用戶會自動分配一個隨機的,不重複的Socket#id
,經過Socket#id
能夠實現將信息分發給我的express
var socketId = socket.id; socket.broadcast.to(socketId ).emit('my message', msg);//socket均爲connect中回調函數中的socket
socket.emit(約定參數,data)//發送信息 socket.on(約定參數,callback);//接收信息
六、Socket.IO還能夠按照命名空間劃分出不一樣的空間,詳見http://socket.io/docs/rooms-and-namespaces/npm
{ "name": "ezsocket", "version": "0.0.0", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "body-parser": "~1.13.2", "cookie-parser": "~1.3.5", "debug": "~2.2.0", "express": "~4.13.1", "jade": "~1.11.0", "morgan": "~1.6.1", "multiparty":"4.1.2", "socket.io":"1.4.5", "serve-favicon": "~2.3.0" } }
框架及版本如上,視圖採用jade模板,主要過程爲用戶進入聊天室先輸入名字(未查重),點擊肯定後發送名字等信息,進入聊天頁面,在文本框中輸入,點擊發送按鈕,發送信息。接收服務器端的相應信息,對其處理,進行界面的展現。json
$(function(){ var socket=io.connect(); $('.j_btn').on('click',function(){//進入頁面肯定按鈕點擊事件 console.log(8888); var msg = $('.j_nametext').val(); socket.emit('login',msg);//向服務器發送用戶註冊名字信息 }) $('#j_mesbtn').on('click',function(){//文本框按鈕點擊事件 var data = $('#j_msgtext').html(); console.log(data); var str = '<li><div class="top-right-content"><pre>'+data+'</pre></div></li>' $('.right-top-ul').append(str); socket.emit('msg',data);//向服務器發送文本框中信息 }) socket.on('system',function(data){//接收服務器端信息 var str = '<li class="right-top-time" style="color:red">歡迎??'+data+'??進入聊天室,撒花</li>'; $('.right-top-ul').append(str); }); socket.on('chat',function(data){ console.log(data); var str = '<li><div class="top-left-content"><span>'+data.name+'</span><pre>'+data.data+'</pre></div></li>' $('.right-top-ul').append(str); }) socket.on('loginSuccess',function(){//接收服務器端登陸成功信息 $('.float-player').css('display','none'); $('.dialog').css('display','none'); }); socket.on('disconnect',function(data){//接收服務器端發送的用戶離開的信息 console.log(data); var str = '<li class="right-top-time" style="color:red">??'+data+'??離開了組織,願他早日回到組織的懷抱</li>'; $('.right-top-ul').append(str); }); $('#j_sendmsg').on('change',function(){//上傳文件事件 // 判斷上傳文件類型 var objFile = $('#j_sendmsg').val(); var objType = objFile.substring(objFile.lastIndexOf(".")).toLowerCase(); var formData = new FormData(document.forms.namedItem("test")); $.ajax({ type : 'post', url : '/uploadUserImgPre', data: formData , processData:false, async:false, cache: false, contentType: false, success:function(re){ re.imgSrc = re.imgSrc.replace('public',''); re.imgSrc = re.imgSrc.replace(/\\/g,'\/'); $('#j_msgtext').append('[站外圖片上傳中……(4)]') }, error:function(re){ console.log(re); } }); }); })
服務器端主要功能爲
一、前方發送登陸信息,服務器端接收並廣播給所有用戶,將登陸成功信息傳給客戶端,客戶端進行相應操做。
二、客戶端經過發送按鈕發送信息,服務器端收到後,廣播給除非發送人員全部人。
三、用戶離開,觸發服務器端disconnect
,服武器端廣播給全體在線人員。
代碼以下:
io.on('connection', function(socket) { console.log(socket.id); var socketId = socket.id; socket.on('login',function(nickname){//接收登陸 socket.nickname = nickname; socket.emit('loginSuccess');//發送登陸成功信息 io.sockets.emit('system', nickname);//廣播 }); socket.on('msg',function(data){//接收文本框中信息 console.log(data); var sendMsg = {'name':socket.nickname,'data':data} socket.broadcast.emit('chat',sendMsg);//廣播 }); socket.on('disconnect',function(){ io.sockets.emit('disconnect', socket.nickname); }) });
下載後再package.json
所在位置打開命令行,經過npm install
安裝依賴,安裝好後經過node app.js
啓動服務,在google瀏覽器中輸入 localhost:3000
本文對Socket.IO作了簡單瞭解,如有不足或錯誤之處,還請多多指出。利用socket.io+nodejs打造簡單聊天室
注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權