首頁>技術>

背景簡介

以前開發HTTP伺服器更多使用的是python語言中的Flask框架來完成,但是在最近的業務中涉及到在web頁面中實時獲取訊息更新,這個時候我能想到的解決方案

1.寫一個迴圈ajax請求,不斷請求後臺伺服器然後更新資料

2.藉助websocket協議從服務端推送新資料到web端

3.socketio

考慮到輪詢ajax的偽實時和頻寬成本,以及websocket的相容性後,決定採取方案3 socketio。

socketio這個協議本身和node配合會非常好,所以決定學習一下node應用的編寫,當然Flask本身也有第三方中介軟體flask-socketio對應的實現

編寫node應用一般使用web framework是以下兩個

1.express

2.koa

Express

express相對來說比較簡單一點,如你所想,第一個例程通常都是由Hello world開始

萬能的Hello world

開始之前記得安裝express

npm i express

以下例程來自socketio官方上

index.js檔案內容如下

var express = require('express');

var http = require('http')

var socketio = require('socket.io')

var app = express();

var server = http.Server(app);

var io = socketio(server);

app.get('/', (req, res) => {

res.sendFile(__dirname + '/index.html');

});

// 註冊新連線到來的回撥函式

io.on('connection', (socket) => {

console.log('one connect comming');

});

server.listen(3000, () => {

console.log('listening on *:3000');

});

index.html檔案內容如下

<!doctype html>

<html>

<head>

<script src="/socket.io/socket.io.js"></script>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<title>Socket.IO chat</title>

<style></style>

</head>

<body>

<form action="">

<input id="msg" autocomplete="off" /><button>Send</button>

</form>

<ul id="messages"></ul>

</body>

<script>

var socket = io();

</script>

</html>

編寫完成之後呼叫node index.js執行伺服器,用瀏覽器訪問一下localhost:3000看看效果,如果程式正常應該在控制檯和瀏覽器端可以看到效果

終端輸出

瀏覽器端

訊息同步功能實現(簡易的聊天室)

如果需要實現在多個瀏覽器上同步訊息,實現原理為由客戶端向服務端傳送訊息,然後再由服務端向客戶端推送訊息,示意圖如下

通訊原理圖

要完成上圖的效果,我們首先需要實現客戶端向node服務傳送聊天事件,編寫index.html,將其中的script標籤內的指令碼修改如下程式碼如下

<script>

// 新建立一個socketio client;

var socket = io();

// 註冊chat事件回撥函式

socket.on('chat', function(msg){

$('#messages').append($('<li>').text(msg)); // 每接收到一條chat事件, 我們就在dom上插入一條文字

});

$('form').submit(function(e){

e.preventDefault();

socket.emit('chat', $('#msg').val()); // 向服務端傳送chat事件

$('#msg').val('');

return false;

});

</script>

然後我們需要實現的是服務向其它客戶端推送chat事件,

呼叫on方法即可註冊回撥函式, 其中第一個引數'connection'為事件名稱, 第二個引數為回撥函式,將index.js程式碼修改成下圖

// 註冊新連線到來的回撥函式

io.on('connection', (socket) => {

socket.on('chat', (msg) => {

//io.emit用來向所有已經建立連線的socket傳送事件

io.emit('chat', msg);

});

});

效果動態圖,我這邊是使用4個瀏覽器容器來模擬多人同步的場景

133

HTML

Flask

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • ASP.NET Core靜態檔案處理原始碼探究