Go实现WebSocket
发布人:shili8
发布时间:2024-11-08 19:55
阅读次数:0
**Go 实现 WebSocket**
WebSocket 是一种用于实时通信的协议,允许客户端和服务器之间进行双向数据传输。它是 HTML5 的一部分,并且已经被广泛应用在各种领域,如即时通讯、游戏等。
在 Go 中,我们可以使用 `net` 包来实现 WebSocket服务器和客户端。在本文中,我们将一步步地讲解如何实现一个简单的 WebSocket服务器和客户端。
### WebSocket服务器首先,我们需要创建一个 WebSocket服务器。我们将使用 `net/ 包来实现这个功能。
gopackage mainimport (
"bufio"
"fmt"
"net"
)
// WebSocketServer 是一个 WebSocket服务器type WebSocketServer struct {
listener net.Listener}
// NewWebSocketServer 创建一个新的 WebSocket服务器func NewWebSocketServer(addr string) (*WebSocketServer, error) {
l, err := net.Listen("tcp", addr)
if err != nil {
return nil, err}
return &WebSocketServer{listener: l}, nil}
// ServeHTTP 处理 HTTP 请求func (s *WebSocketServer) ServeHTTP(w r * {
if r.Method == "GET" {
w.Write([]byte("Hello, WebSocket!"))
} else if r.Method == "WS" {
s.handleWebSocket(r)
}
}
// handleWebSocket 处理 WebSocket 请求func (s *WebSocketServer) handleWebSocket(r * {
conn, err := s.listener.Accept()
if err != nil {
fmt.Println(err)
return}
go func() {
defer conn.Close()
s.handleConnection(conn)
}()
}
// handleConnection 处理 WebSocket 连接func (s *WebSocketServer) handleConnection(conn net.Conn) {
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
func main() {
server, err := NewWebSocketServer(":8080")
if err != nil {
fmt.Println(err)
return}
server)
fmt.Println("WebSocket服务器启动成功!")
select {}
}
在这个例子中,我们创建了一个 `WebSocketServer` 结构体,包含一个 `listener` 字段。我们使用 `net.Listen` 函数来监听 TCP 连接,并将其赋值给 `listener`。
当客户端连接到服务器时,我们会调用 `handleWebSocket` 函数来处理 WebSocket 请求。在这个函数中,我们首先检查是否是 WebSocket 请求,如果是,则创建一个新的连接并启动一个 goroutine 来处理该连接。
在 `handleConnection` 函数中,我们使用 `bufio.Scanner` 来读取来自客户端的数据,并将其打印到控制台。
### WebSocket 客户端下面我们来看一下如何实现一个简单的 WebSocket 客户端。
gopackage mainimport (
"fmt"
"net/ />)
// WebSocketClient 是一个 WebSocket 客户端type WebSocketClient struct {
conn * />
// NewWebSocketClient 创建一个新的 WebSocket 客户端func NewWebSocketClient() (*WebSocketClient, error) {
return &WebSocketClient{conn: & nil}
// Connect 连接到 WebSocket服务器func (c *WebSocketClient) Connect(addr string) error {
req, err := addr, nil)
if err != nil {
return err}
resp, err := c.conn.Do(req)
if err != nil {
return err}
defer resp.Body.Close()
return nil}
// SendMessage 发送消息到 WebSocket服务器func (c *WebSocketClient) SendMessage(msg string) error {
req, err := "ws://localhost:8080", strings.NewReader(msg))
if err != nil {
return err}
resp, err := c.conn.Do(req)
if err != nil {
return err}
defer resp.Body.Close()
return nil}
func main() {
client, err := NewWebSocketClient()
if err != nil {
fmt.Println(err)
return}
err = client.Connect("ws://localhost:8080")
if err != nil {
fmt.Println(err)
return}
err = client.SendMessage("Hello, WebSocket!")
if err != nil {
fmt.Println(err)
return}
select {}
}
在这个例子中,我们创建了一个 `WebSocketClient` 结构体,包含一个 `conn` 字段。我们使用 `net/ 包来实现客户端。
当客户端连接到服务器时,我们会调用 `Connect` 函数来建立 WebSocket 连接。在这个函数中,我们首先检查是否是 WebSocket 请求,如果是,则创建一个新的请求并将其发送给服务器。
在 `SendMessage` 函数中,我们使用 ` 来创建一个新请求,并将消息作为请求体发送到服务器。
### 总结在本文中,我们讲解了如何实现一个简单的 WebSocket服务器和客户端。在 Go 中,我们可以使用 `net/ 包来实现 WebSocket服务器和客户端。我们通过一步步地讲解如何创建 WebSocket服务器和客户端,来展示了如何使用 Go 来实现 WebSocket。
希望本文对你有所帮助。如果你有任何问题或建议,请随时告诉我!

