1. 程式人生 > >Nodejs實時通訊 線上聊天室(Socket.io)_收藏

Nodejs實時通訊 線上聊天室(Socket.io)_收藏

socketio

前言

網路聊天室在web1.0的時代就出現了,但當時技術支援比較有限,大都是通過瀏覽器外掛BHO,JavaApplet,Flash實現的。如今HTML5技術風起雲湧,通過websocket實現的網路聊天室,被定義為websocket的第一個實驗,就像Hello World一樣的簡單。

今天我也動手完成了這個實驗,感覺真的很爽!

目錄

  1. socket.io介紹
  2. 伺服器端和客戶端通訊設計
  3. 伺服器端實現
  4. 客戶端實現
  5. 完整案例程式碼

1. socket.io介紹

socket.io一個是基於Nodejs架構體系的,支援websocket的協議用於時時通訊的一個軟體包。socket.io 給跨瀏覽器構建實時應用提供了完整的封裝,socket.io完全由javascript實現。

2. 伺服器端和客戶端通訊設計

chat

上圖中client1 和 server 描述通訊過程,client2描述對其他的客戶端,通過廣播進行訊息通訊。

  1. client1向server發起連線請求
  2. server接受client的連線
  3. client1輸入登陸使用者名稱
  4. server返回歡迎語
  5. server通過廣播告訴其他線上的使用者,client1已登陸
  6. client1傳送聊天資訊
  7. server返回聊天資訊(可省略)
  8. server通過廣播告訴其他線上的使用者,client1的聊天訊息
  9. client1關閉連線,退出登陸
  10. server通過廣播告訴其他線上的使用者,client1已退出

我們看一下測試截圖:
chat2

  1. 左邊: aaa 登陸
  2. 右邊: bbb 登陸
  3. 左邊: aaa 收到 bbb登陸歡迎訊息
  4. aaa 和 bbb 實現對話
  5. 右邊: bbb 重新整理瀏覽自動退出
  6. 左邊: aaa 收到 bbb的退出訊息
  7. 右邊: CCC 登陸
  8. 左邊: aaa 收到 CCC 登陸歡迎訊息
  9. aaa 和 CCC 實現對話

3. 伺服器端實現

我們這裡使用socket.io和express3的混合模式,讓HTTP請求和WebSocket請求都使用3000埠。

伺服器端實現,只有一個核心檔案app.js。


//引入程式包
var express = require('express')
  , path = require('path')
  , app = express()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

//設定日誌級別
io.set('log level', 1); 

//WebSocket連線監聽
io.on('connection', function (socket) {
  socket.emit('open');//通知客戶端已連線

  // 列印握手資訊
  // console.log(socket.handshake);

  // 構造客戶端物件
  var client = {
    socket:socket,
    name:false,
    color:getColor()
  }

  // 對message事件的監聽
  socket.on('message', function(msg){
    var obj = {time:getTime(),color:client.color};

    // 判斷是不是第一次連線,以第一條訊息作為使用者名稱
    if(!client.name){
        client.name = msg;
        obj['text']=client.name;
        obj['author']='System';
        obj['type']='welcome';
        console.log(client.name + ' login');

        //返回歡迎語
        socket.emit('system',obj);
        //廣播新使用者已登陸
        socket.broadcast.emit('system',obj);
     }else{

        //如果不是第一次的連線,正常的聊天訊息
        obj['text']=msg;
        obj['author']=client.name;      
        obj['type']='message';
        console.log(client.name + ' say: ' + msg);

        // 返回訊息(可以省略)
        socket.emit('message',obj);
        // 廣播向其他使用者發訊息
        socket.broadcast.emit('message',obj);
      }
    });

    //監聽出退事件
    socket.on('disconnect', function () {  
      var obj = {
        time:getTime(),
        color:client.color,
        author:'System',
        text:client.name,
        type:'disconnect'
      };

      // 廣播使用者已退出
      socket.broadcast.emit('system',obj);
      console.log(client.name + 'Disconnect');
    });

});

//express基本配置
app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

// 指定webscoket的客戶端的html檔案
app.get('/', function(req, res){
  res.sendfile('views/chat.html');
});

server.listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

var getTime=function(){
  var date = new Date();
  return date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
}

var getColor=function(){
  var colors = ['aliceblue','antiquewhite','aqua','aquamarine','pink','red','green',
                'orange','blue','blueviolet','brown','burlywood','cadetblue'];
  return colors[Math.round(Math.random() * 10000 % colors.length)];
}

4. 客戶端實現

這裡我們需要定義幾個檔案:chat.html, chat.js, jquery.min.js, main.css

1). views/chat.html


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Socket.io - Simple chat</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<script src="javascripts/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="javascripts/chat.js"></script>
</head>
<body>
<h1>Socket.io - Simple chat room</h1>
<div>
<span id="status">Connecting...</span>
<input type="text" id="input"/>
</div>
<div id="content"></div>
</body>
</html>

2). public/javascript/chat.js


$(function () {
var content = $('#content');
var status = $('#status');
var input = $('#input');
var myName = false;

//建立websocket連線
socket = io.connect('http://localhost:3000');
//收到server的連線確認
socket.on('open',function(){
status.text('Choose a name:');
});

//監聽system事件,判斷welcome或者disconnect,列印系統訊息資訊
socket.on('system',function(json){
var p = '';
if (json.type === 'welcome'){
if(myName==json.text) status.text(myName + ': ').css('color', json.color);
p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Welcome ' + json.text +'</p>';
}else if(json.type == 'disconnect'){
p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Bye ' + json.text +'</p>';
}
content.prepend(p);
});

//監聽message事件,列印訊息資訊
socket.on('message',function(json){
var p = '<p><span style="color:'+json.color+';">' + json.author+'</span> @ '+ json.time+ ' : '+json.text+'</p>';
content.prepend(p);
});

//通過“回車”提交聊天資訊
input.keydown(function(e) {
if (e.keyCode === 13) {
var msg = $(this).val();
if (!msg) return;
socket.send(msg);
$(this).val('');
if (myName === false) {
myName = msg;
}
}
});
});

3). public/javascript/jquery.min.js
從jquery官方下載: http://jquery.com/

4). public/css/main.css


* {padding:0px; margin:0px;}
body{font-family:tahoma; font-size:12px;margin:10px;}
p {line-height:18px;padding:2px;}
div {width:500px;}
#content { 
    padding:5px; 
    background:#ddd; 
    border-radius:5px;
    border:1px solid #CCC; 
    margin-top:10px; 
}
#input { 
    border-radius:2px; 
    border:1px solid #ccc;
    margin-top:10px; 
    padding:5px; 
    width:380px;  
}
#status { 
    width:100px; 
    display:block; 
    float:left; 
    margin-top:15px; 
}

5. 完整案例程式碼

專案已經上傳到github: https://github.com/bsspirit/chat-websocket

下載,安裝,啟動伺服器


git clone https://github.com/bsspirit/chat-websocket.git
npm install
node app.js

開啟瀏覽器
可以多開啟幾個視窗,模擬不同使用者有的對話。

http://localhost:3000

做完實驗,感覺棒極了。技術創新的革命!!

相關推薦

Nodejs實時通訊 線上聊天Socket.io)_收藏

前言 網路聊天室在web1.0的時代就出現了,但當時技術支援比較有限,大都是通過瀏覽器外掛BHO,JavaApplet,Flash實現的。如今HTML5技術風起雲湧,通過websocket實現的網路聊天室,被定義為websocket的第一個實驗,就像Hello World

用React + Redux + NodeJS 開發一個線上聊天

最近工作比較閒,所以學了點React和Redux相關的東西,然後又做了個簡單的線上聊天室練手, 現在就記錄下如何用React和Redux來構建一個簡單的線上聊天室。 原始碼地址: Github (之後有時間也會陸續加點新功能、完善原有程式碼) 效果圖: 一、技術棧

網路程式設計之即時通訊程式(聊天)------一)通訊流程簡介及通訊協議定製

      在開始講之前,我想先跟大家描述一下,這個所謂的通訊程式具體是一個什麼樣的東西。該通訊程式類似一個弱版本的qq,登入時需要進行註冊,登入成功後,可以實現即時的通訊,群聊,私聊,同時還可傳檔案。先上個圖 服務端:                           

WebRTC實時通訊系列教程7 使用Socket.IO搭建信令伺服器交換資訊

 PS:如果本文對您有幫助,請點個贊讓我知道哦~ 一、譯文 1、你將學到 使用 npm 安裝 package.json檔案裡的專案依賴執行Node伺服器並使用node-static模組支援靜態資原始檔訪問.使用 socket.io

JAVA-Socket通訊 打造屬於自己的聊天初級版)

我們每天都在使用著微信、QQ等聊天軟體,但不知你是否有想過這些聊天軟體是如何實現的?是否想過要製作一個屬於自己的聊天室? 本篇部落格將帶你打造一個簡單的屬於自己的聊天室,將cmd作為聊天視窗,可通過內網,與周圍的小夥伴相互通訊,當然也可以掛到伺服器上,實現通過外網的通訊。同時還能通過服務端視窗對連入的使用者

AgileEAS.NET SOA 中介軟體平臺.Net Socket通訊框架-完整應用例子-線上聊天系統-程式碼解析

一、AgileEAS.NET SOA中介軟體Socket/Tcp框架介紹 AgileEAS.NET SOA中介軟體Socket/Tcp框架是一套Socket通訊的訊息中介軟體: 二、多人線上聊天室系統       相對於簡單的客戶端==》服務端訊息請求與應答的例子而言,線上多人聊天室系統的複

AgileEAS.NET SOA 中介軟體平臺.Net Socket通訊框架-完整應用例子-線上聊天系統-下載配置

一、AgileEAS.NET SOA中介軟體Socket/Tcp框架介紹 AgileEAS.NET SOA中介軟體Socket/Tcp框架是一套Socket通訊的訊息中介軟體: 二、簡單的伺服器客戶段訊息應答 三、完整的應用-實現完整的聊天室      本文我們將實現一個多人聊天室的應用,

用CocosCreator和Pomelo編寫多人在線實時聊天一)----基礎知識和環境安裝

shu 以及 pan 信息 ast pre alt web 技術 客戶端:Cocos Creator 1.6.2服務器端:Pomelo 2.2.5源碼地址:https://github.com/foupwang/CocosCreatorChatForPomelo.git 本

1024_(即時通訊)使用node.js和socket.io實現多人聊天

使用node.js和socket.io實現多人聊天室 2015年01月24日 03:24:54 遠古大猛獁 閱讀數:2775 轉自: http://www.cnblogs.com/flyoung2008/archive/2012/07/19/2600132.html

Asp.NET MVC 使用 SignalR 實現推送功能二Hubs 線上聊天 獲取儲存使用者資訊)

簡單介紹 在上一篇中,我們只是介紹了簡單的訊息推送,今天我們來修改一下,實現儲存訊息,歷史訊息和使用者線上 使用者登入註冊資訊 當用戶登入之後,我們註冊一下使用者的資訊,我們在ChatHub中 新建一個方法 Register(使用者帳號,使用者密碼) 前臺js呼叫這個方法實現使用者註冊 

Asp.NET MVC 使用 SignalR 實現推送功能一Hubs 線上聊天

簡介       ASP .NET SignalR 是一個ASP .NET 下的類庫,可以在ASP .NET 的Web專案中實現實時通訊。什麼是實時通訊的Web呢?就是讓客戶端(Web頁面)和伺服器端可以互相通知訊息及呼叫方法,當然這是實時操作的。 WebSockets是HTML5提供的新的API

Socket編寫一個簡易的聊天相關知識點的總結)

初次接觸到Socket的時候,還以為是網路程式設計的部分。學完後才發現,他也是Java中的一個類。只是它和TCP協議掛鉤了。在用Socket的時候要考慮到網路和協議的問題,以及每個應用程式相對應的埠,當伺服器或者客服端通過網路接受到資訊的時候,會先根據IP地址找到相應的位置

實現簡易聊天一)

ima log body .com 麻煩 導入 定義 右鍵 正常 預備工作: (1)讀取文件的時候可能會遇到多個文件一起傳,可以用線程池。 (2)發送不同類型的請求時,如發送的是聊天信息,發送的是文件,發送的是好友上線請求等,但對於接受者來說都是字節流無法分別,這就需要我們

nodejs實現在線聊天

erp 路由 結構 監聽 const mongodb conf 處理 bsp 源碼地址:https://github.com/qmdx00/AszedRoom/tree/master/Aszed 上線地址:http://119.23.243.252:3000/ 求sta

仿班級聊天DOM原型法)並且用localStorage儲存訊息記錄

第一部分:CSS程式碼 * {                 margin: 0px;         

二)網路程式設計:聊天2)

第五步:既然是聊天室,那麼僅僅只能一個使用者自己和自己聊天,顯然該該程式是有瑕疵的。那麼我們就需要支援多使用者同時線上聊天。這一步中,我們就需要用到多執行緒的概念。為什麼要用到多執行緒?執行緒可以通俗的理解為每有一個新運動員便多建造一條跑道,以便所有運動員可以經歷同樣的從頭到尾的全部過程。那如果放到

二)網路程式設計:聊天1)

概述:通過網路程式設計來實現聊天室功能 第一步:建立服務端與客戶端並建立連線         服務端:         import java.io.IOException;     &n

Netty聊天2):從0開始實戰100w級流量應用

目錄 客戶端 Client 登入和響應處理 寫在前面 客戶端的會話管理 客戶端的邏輯構成 連線伺服器與Session 的建立 Session和 channel 相互繫結 AttributeMap介面的使用 客戶端登入請求 處理登入成

Unity 簡易聊天基於TCP)1)

為了準備畢業設計,學習了伺服器與客戶端之間傳輸的一些簡單的知識,並跟著網路上的教程製作了一個簡易的Unity聊天室 伺服器:用C# .Net Framework寫的 結構分為:main(主函式)、Server類(用於伺服器的開啟和接收客戶端連線)、Client類(接收訊息和傳送訊息)、Message類(用

Django + WebSocket + Redis 線上聊天題文章

話不多說先上效果圖演示 專案:http://112.74.164.107:9990/ 1、安裝組建 redis: yum install redis/apt install redis 2、建立虛擬化環境並進入 python3/python -m venv venv source venv\bin