WebSocket是一種在單個 TCP 連接上進行全雙工通信的協議。 它使得實時和非同步應用程序成為可能。WebSocket最初是通過瀏覽器使用的,但現在它也被應用於伺服器端。在本文中,我們將重點介紹WebSocket服務端方面的內容。
一、WebSocket服務端工具
WebSocket服務端的工具有多種選擇,比如PHP、Node.js等。這些工具都提供了WebSocket的庫和API。例如,Node.js的庫「ws」可以輕鬆地創建WebSocket伺服器。這是一份使用Node.js的代碼示例:
const WebSocket = require('ws'); const server = new WebSocket.Server({ port: 8080 }); server.on('connection', (ws) => { ws.send('Hello, client!'); ws.on('message', (message) => { console.log(`Received message: ${message}`); }); });
這個代碼片段創建了一個WebSocket伺服器,並在客戶端連接時向客戶端發送一條消息。當客戶端發送消息時,它將被列印到控制台上。
二、WebSocket服務端路徑錯誤
WebSocket服務端的路徑是一個非常重要的問題。如果路徑錯誤,客戶端就無法連接到伺服器。默認的路徑是「/」。如果需要修改路徑,需要在伺服器上設置。以下是一個使用PHP創建WebSocket伺服器的示例:
$server = new swoole_websocket_server('127.0.0.1', 9501); $server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; }); $server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server"); }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start();
為了修改路徑,可以在「new swoole_websocket_server()」中傳遞參數來添加路徑。例如,可以使用「$server = new swoole_websocket_server(‘127.0.0.1’, 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);」來指定路徑為「127.0.0.1:9501」。
三、WebSocket服務端加密
WebSocket通過TLS / SSL保護客戶端和伺服器之間的通信。它使用Secure Sockets Layer(SSL)或TLS(Transport Layer Security)來加密數據並確保數據不被劫持。以下是一個使用Node.js的示例:
const https = require('https'); const WebSocket = require('ws'); const fs = require('fs'); const server = https.createServer({ cert: fs.readFileSync(''), key: fs.readFileSync('') }); const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { ws.send('Hello, client!'); ws.on('message', (message) => { console.log(`Received message: ${message}`); }); }); server.listen(8080);
在這個例子中,我們先創建了一個使用HTTPS協議的伺服器,然後創建了一個WebSocket伺服器。我們使用了TLS / SSL保護數據。
四、WebSocket伺服器
WebSocket伺服器是可以讓客戶端和伺服器之間進行實時通信的服務。WebSocket伺服器可以使用不同的編程語言來實現。這個例子使用Python創建伺服器:
#!/usr/bin/env python import asyncio import websockets async def hello(websocket, path): name = await websocket.recv() print(f" {greeting}") start_server = websockets.serve(hello, "localhost", 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
這個例子創建了一個WebSocket伺服器,當客戶端連接時,它會發送一條問候消息並等待客戶端的響應。然後,它會將收到的響應列印到控制台上。
五、WebSocket服務端搭建
我們可以使用不同的編程語言來搭建WebSocket服務端。以下是一個使用Java的例子:
@ServerEndpoint("/echo") public class EchoServer { @OnOpen public void onOpen(Session session) { System.out.println("onOpen"); try { session.getBasicRemote().sendText("Hello, client!"); } catch (IOException ex) { ex.printStackTrace(); } } @OnMessage public void onMessage(Session session, String message) { System.out.println("onMessage: " + message); } @OnClose public void onClose(Session session) { System.out.println("onClose"); } }
這個例子使用Java的WebSocket API來搭建服務端。服務端接收到一個連接請求時,會向客戶端發出問候消息,並等待客戶端的響應。一旦收到響應,就會將其列印到控制台上。
六、WebSocket服務端設置
為了使WebSocket伺服器正常工作,我們需要設置一些參數。以下是一個使用Python的示例:
#!/usr/bin/env python import asyncio import websockets import ssl ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context.load_cert_chain('', '') async def hello(websocket, path): name = await websocket.recv() print(f" {greeting}") start_server = websockets.serve(hello, "localhost", 8765, ssl=ssl_context) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
在這個例子中,我們使用Python的「ssl」模塊來設置SSL上下文。我們還使用了用戶名和密碼來保護WebSocket伺服器。
七、WebSocket服務端和客戶端
為了測試WebSocket伺服器,我們需要編寫WebSocket客戶端。以下是一個使用Java的WebSocket客戶端示例:
@ClientEndpoint public class EchoClient { @OnOpen public void onOpen(Session session) { System.out.println("onOpen"); try { session.getBasicRemote().sendText("Hello, server!"); } catch (IOException ex) { ex.printStackTrace(); } } @OnMessage public void onMessage(Session session, String message) { System.out.println("onMessage: " + message); } @OnClose public void onClose(Session session) { System.out.println("onClose"); } }
這個例子創建了一個WebSocket客戶端,當它連接到伺服器時,它會向伺服器發送一條問候消息,並等待伺服器的響應。一旦收到響應,就會將其列印到控制台上。
八、WebSocket服務端什麼協議
WebSocket使用HTTP / 1.1協議升級到WebSocket協議。這個過程被稱為「握手」,它允許客戶端和伺服器協商WebSocket支持。以下是一個使用Node.js的示例:
const http = require('http'); const WebSocket = require('ws'); const fs = require('fs'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, World!'); }); const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { ws.send('Hello, client!'); ws.on('message', (message) => { console.log(`Received message: ${message}`); }); }); server.listen(8080);
這個例子創建了一個HTTP伺服器。當客戶端連接時,它會向客戶端發送一條問候消息,並等待客戶端的響應。然後,它會將收到的響應列印到控制台上。
九、WebSocket服務端接收消息
WebSocket伺服器可以接收來自客戶端的消息。以下是一個使用PHP創建WebSocket伺服器的示例:
$server = new swoole_websocket_server('127.0.0.1', 9501); $server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; }); $server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server"); }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start();
在這個例子中,當客戶端發送消息時,服務端會接收到並輸出到控制台上。
十、WebSocket服務端主動斷開連接
WebSocket伺服器可以在需要時關閉連接。以下是一個使用Node.js的示例:
const WebSocket = require('ws'); const server = new WebSocket.Server({ port: 8080 }); server.on('connection', (ws) => { ws.send('Hello, client!'); setTimeout(() => { ws.close(); }, 5000); ws.on('message', (message) => { console.log(`Received message: ${message}`); }); });
在這個例子中,WebSocket伺服器從客戶端接受一條消息,然後等待5秒鐘後關閉連接。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151714.html