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。
希望本文对你有所帮助。如果你有任何问题或建议,请随时告诉我!