Socket.IO聊天室

小編心語:大家過完聖誕準備迎元旦吧~小編在這裏預祝大家元旦快樂!!這一次要分享的東西小編也不是很懂啊,總之小編把它拿出來是覺地比較稀奇,而且程序也沒有那麼難,是一個比較簡單的程序,大家可以多多試試~

Socket.IO聊天室

簡介:Socket.IO實現了實時雙向的基於事件的通訊機制。旨在讓各種瀏覽器與移動設備上實現實時app功能,模糊化各種傳輸機制。
下面我們使用Node.js和Socket.IO來做一個簡單的聊天室。
一、初始化項目

(這個是在實驗樓網站的虛擬平臺需要實現的~可自動略過這一環節,不需要也可以的哈)

打開虛擬機終端,新建一個文件夾socketio,進入此文件夾使用npm初始化項目:

$ npm init



然後輸入項目相關信息,也可以不輸入,直接一路回車,完成後會在此目錄下生產一個package.json文件。這個文件用於描述項目相關信息,以及聲明項目中所使用的模塊。
然後安裝Socket.IO:

$ npm install socket.io --save


安裝Socket.IO的時候,--save參數用於保存模塊依賴信息到package.json文件,安裝完後,打開package.json文件會看到裏面多了一項內容:

"dependencies": {    "socket.io": "^1.2.1"}


同時Socket.IO安裝在了node_modules文件夾下。
二、創建http server

安裝Socket.IO模塊,我們現在先來創建一個可訪問的頁面吧。
在文件夾socketio中新建index.js文件,這就是在服務端運行的主文件。
首先在index.js中添加如下代碼,引入所需的模塊:

var http = require('http');           // http 模塊,用於創建http server
var socketio = require('socket.io');  // socket.io 模塊
var fs = require('fs');               // fs 模塊,用於讀取文件



然後通過http模塊創建app,在index.js文件中添加代碼:

// http.createServer()方法用於創建http server// 以處理來自瀏覽器的請求
var app = http.createServer(function(req, res) {    
// fs.readFile()方法用於讀取文件
    // 此處讀取的是index.html文件
    // 也就是我們後面要編寫的HTML頁面文件
    fs.readFile(__dirname + '/index.html', function (err, data) {        
    if (err) {
            res.writeHead(500);            
            return res.end('Error loading index.html');
        }
        res.writeHead(200); // 返回請求狀態碼
        res.write(data);    // 返回讀取到的內容給瀏覽器
        res.end();
    });
}).listen(8080); 
// listen()方法用監聽http server到指定的地址和端口,默認地址是localhost


在文件夾socketio中新建index.html文件,代碼如下:

<!doctype html><html>
    <head>
        <meta charset="utf-8">
        <title>Socket.IO chat</title>
    </head>
    <body>
        Hello, shiyanlou.    </body></html>



運行程序:

$ node index.js



然後打開虛擬機中的瀏覽器,訪問“127.0.0.1:8080”瀏覽器頁面中出現“Hello, shiyanlou.”,說明創建的http server成功了。
三、實現聊天

下面我們就來創建Socket.IO對象吧:

// 在與app相同的地址和端口上創建Socket.IO服務
var io = socketio(app);// 監聽connection事件
// 當瀏覽器連接到此Socket.IO服務時觸發該事件
io.on('connection', function (socket) {    
// 監聽瀏覽器端的chat事件
    socket.on('chat', function (data) {        
    console.log(data);
    });
});



這裏在服務器端監聽了來自瀏覽器的chat事件,後面我們會在index.html中實現此事件。
先來實現一個簡單聊天界面吧,修改index.html文件中的代碼如下所示:

<!doctype html><html>
    <head>
        <meta charset="utf-8">
        <title>Socket.IO chat</title>
        <style>
            * { margin: 0; padding: 0; box-sizing: border-box; }
            body { font: 13px Helvetica, Arial; }
            #form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
            #form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
            #form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
            #messages { list-style-type: none; margin: 0; padding: 0; }
            #messages li { padding: 5px 10px; }
            #messages li:nth-child(odd) { background: #eee; }
        </style>
        <!-- 引入socket.io庫和jQuery庫 -->
        <script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
        <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    </head>
    <body>
        <!-- 顯示消息記錄 -->
        <ul id="messages"></ul>

        <!-- 消息發送框 -->
        <div id="form">
            <input id="m" autocomplete="off" /><button id="send">Send</button>
        </div>
    </body></html>



然後在瀏覽器端創建chat事件,在index.html文件中添加如下JavaScript代碼:

<script>// 連接到Socket.IO服務器var socket = io.connect();

$(function() {    // 綁定發按鈕發送消息的事件
    $('#send').on('click', function() { 
           var data = $('#m').val(); 
         // 創建chat事件併發送消息給服務器
        // emit('event') 表示發送了一個event命令
        // 使用io.on('event')接收對應事件的信息
        // 所以客戶端服務器端需要使用socket.on('chat')接收聊天信息
        socket.emit('chat', { msg: data });
        $('#m').val('');
    });
});</script>



現在運行項目:

$ node index.js



使用虛擬機中的瀏覽器訪問“127.0.0.1:8080”,通過聊天框發送消息,會看到服務器端會打印出相應消息內容。
下面我們來實現把用戶發送的消息發送給所有客戶端,在index.js文件中創建sendmsg事件:

io.on('connection', function (socket) {
    socket.on('chat', function (data) {    
        console.log(data);    
            // 創建sendmsg事件並把發送聊天消息給客戶端
        io.emit('sendmsg', data);
    });
});

客戶端接收並顯示消息,在index.html中添加JavaScript代碼:

$(function() {    // ...

    // 接收消息並顯示到消息記錄框中
    socket.on('sendmsg', function(msg) {
        $('#messages').append($('<li>').text(msg.msg));
    });
});



再重新運行項目:

$ node index.js



現在用瀏覽器打開多個頁面,就能看到別人發送的消息了,這樣一個簡單的實時聊天室就實現了。
當然,你可以自己擴展這個項目,做一個功能更加完整的聊天室。
此項目主要用到了Socket.IO的emit()方法和on()方法,emit()方法用於創建和觸發事件,on()方法用於監聽事件。


更多詳細步驟及內容請登錄http://www.shiyanlou.com/courses/?course_type=project&tag=all

有更多基礎課、項目課歡迎大家登陸實驗樓官方網站http://www.shiyanlou.com
現在登陸實驗樓更有感恩好禮相送http://www.shiyanlou.com/huodong/thanks.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章