大家好,我是码农先森。
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。在2008年 Google 的一位工程师 Ian Hickson 发明并起草了 Websocket 协议的相关规范,后来经过讨论和改进,由 WHATWG 组织负责制定了 WebSocket 的标准。最终,WebSocket 协议在2011年被正式发布为 RFC 6455 标准,同时得到了广泛应用和支持。WebSocket 协议的发明填补了 Web 应用中实时双向通信的空白,为大家提供了更便捷、高效的方式来开发实时性较强的应用程序,例如:聊天网站、在线游戏等一些需要进行实时数据交互的Web应用。
WebSocket是一种在Web浏览器和Web服务器之间进行全双工通信的协议。它提供了一个持久化的连接,允许服务器主动向客户端推送数据,而无需客户端发送请求。相对于传统的HTTP协议,它更加高效、实时,并且减少了通信的延迟。
上面主要是介绍协议传输的标准,接下来我们看看协议的工作流程。
客户端通过发送一个 HTTP 请求到服务器,服务器接收到该请求后,根据请求头的相关字段进行验证和处理,并返回一个 HTTP 响应。客户端接收到服务器的响应后,如果响应状态码为 101 Switching Protocols,表示协议切换成功。此时就可以使用 WebSocket 协议进行双向通信。
Swoole\WebSocket\Server
创建一个 WebSocket
服务。$server->on('open', function(...){...}
监听 open 连接打开事件。$server->on('message', function(...){...}
监听消息接收事件。$server->push(...)
方法推送消息给客户端。$server->on('close', function(...){...}
监听关闭的连接、$server->start()
来正式启动 WebSocket
服务。<?php
// 创建 WebSocket 服务器对象,监听 0.0.0.0:8080 端口
$server = new Swoole\WebSocket\Server('0.0.0.0', 8080);
// 监听 WebSocket 连接打开事件
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
echo "New WebSocket connection opened: {$request->fd}\n";
});
// 监听 WebSocket 消息事件
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
echo "Received message from {$frame->fd}: {$frame->data}\n";
// 向客户端发送回复消息
$server->push($frame->fd, 'Hello from Swoole server!');
});
// 监听 WebSocket 连接关闭事件
$server->on('close', function (Swoole\WebSocket\Server $server, $fd) {
echo "WebSocket connection closed: {$fd}\n";
});
// 启动 WebSocket 服务器
$server->start();
使用 wscat 工具进行连接测试。
MacBook-Pro:demo$ wscat -c 127.0.0.1:8080
Connected (press CTRL+C to quit)
> Hello
< Hello from Swoole server!
http.ListenAndServe
监听 8080 端口。http.HandleFunc("/websocket", handleWebSocket)
及处理函数。conn.ReadMessage()
读取连接的客户端数据。conn.WriteMessage
回复客户端消息。WebSocket
连接。handleWebSocket(...)
每次都是在一个协程当中执行维护的。package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
// 定义 WebSocket 升级器
var upgrader = websocket.Upgrader{}
// 处理 WebSocket 连接的请求
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
// 升级 HTTP 连接为 WebSocket 连接
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Failed to upgrade to WebSocket:", err)
return
}
defer conn.Close()
// 在这里处理 WebSocket 连接
for {
// 读取来自客户端的消息
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Failed to read message from WebSocket:", err)
break
}
// 处理接收到的消息
log.Println("Received message:", string(msg))
// 回复消息给客户端
err = conn.WriteMessage(websocket.TextMessage, []byte("Hello from Go server!"))
if err != nil {
log.Println("Failed to send message to WebSocket:", err)
break
}
}
}
func main() {
// 设置路由和处理函数
http.HandleFunc("/websocket", handleWebSocket)
// 启动 HTTP 服务器
log.Println("Server started on localhost:8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("Failed to start server:", err)
}
}
使用 wscat 工具进行连接测试。
MacBook-Pro:demo$ wscat -c 127.0.0.1:8080
Connected (press CTRL+C to quit)
> Hello
< Hello from Go server!
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。