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"< {name}") greeting = f"Hello {name}!" await websocket.send(greeting) 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"< {name}") greeting = f"Hello {name}!" await websocket.send(greeting) 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秒钟后关闭连接。