WebSocket服务概述
WebSocket是一种HTML5的API,提供了一种在单个TCP连接上进行全双工通信的机制。
与HTTP协议不同的是,WebSocket是一个独立的协议。在建立连接后,WebSocket客户端和服务器之间可以非常快速地双向通信。它可以在客户端和服务器之间建立一个套接字,并用于在客户端和服务器之间发送/接收消息。
WebSocket可以在Web应用程序中创建实时通信,并且可以与任何服务器端语言一起使用,如PHP、Java、Node.js等。最常见的用例是实时聊天应用程序、协作式编辑工具、在线游戏等。
WebSocket服务的特点
WebSocket服务提供了许多特点,其中一些是:
- 全双工通信:客户端和服务器可以同时发送和接收消息。
- 实时性:消息可以立即发送和接收,无需轮询。
- 跨域支持:使用WebSocket可以在不同域名之间进行通信,而不需要任何代理。
- 节省带宽:WebSocket使用较少的带宽,因为它使用二进制协议而不是文本协议。
- 可靠性:WebSocket连接会保持活动状态,直到客户端或服务器关闭它。
Go语言实现WebSocket服务
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("websocket upgrade error:", err)
return
}
for { // 不断地读取客户端的消息
_, message, err := conn.ReadMessage()
if err != nil {
fmt.Println("websocket read message error:", err)
return
}
fmt.Printf("收到客户端消息:%s\n", message)
reply := []byte("收到客户端的消息")
if err = conn.WriteMessage(websocket.TextMessage, reply); err != nil {
fmt.Println("websocket write message error:", err)
return
}
}
}
func main() {
http.HandleFunc("/websocket", wsHandler)
if err := http.ListenAndServe(":8888", nil); err != nil {
fmt.Println("start server error:", err)
}
}
Golang实现WebSocket服务端说明
- 导入websocket包,并通过Upgrader创建WebSocket连接。
- 在wsHandler函数中,通过Upgrader.Upgrade(w, r, nil)升级HTTP连接为WebSocket连接,建立WebSocket通信。
- 通过for循环读取客户端的消息,收到消息后打印,并通过conn.WriteMessage回复消息给客户端。
- 最后通过http.HandleFunc注册WebSocket服务端。
WebSocket客户端测试
WebSocket测试页面 WebSocket客户端测试页面
WebSocket客户端测试说明
- 在JavaScript中实例化WebSocket对象,并通过ws.onopen()、ws.onmessage()、ws.onclose()、ws.onerror()函数处理WebSocket客户端的状态。
- 通过ws.send()函数发送消息给WebSocket服务端,通过evt.data获取从WebSocket服务端返回的消息。