ZBLOG

go webscoket

下面是一个简单的示例,展示如何使用Go语言编写一个基于WebSocket的服务器和客户端。

服务端代码(server.go):

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "github.com/gorilla/websocket"
  7. )
  8. var clients = make(map[*websocket.Conn]bool) // 存储所有连接的客户端
  9. var broadcast = make(chan Message) // 广播通道
  10. // 定义消息结构体
  11. type Message struct {
  12. Username string `json:"username"`
  13. Message string `json:"message"`
  14. }
  15. func main() {
  16. http.HandleFunc("/ws", handleWebSocket)
  17. go startBroadcast()
  18. log.Println("Server is running on http://localhost:8080")
  19. err := http.ListenAndServe(":8080", nil)
  20. if err != nil {
  21. log.Fatal("ListenAndServe: ", err)
  22. }
  23. }
  24. func handleWebSocket(w http.ResponseWriter, r *http.Request) {
  25. upgrader := websocket.Upgrader{
  26. CheckOrigin: func(r *http.Request) bool { return true },
  27. }
  28. conn, err := upgrader.Upgrade(w, r, nil)
  29. if err != nil {
  30. log.Println("Upgrade error:", err)
  31. return
  32. }
  33. defer conn.Close()
  34. log.Println("New client connected")
  35. clients[conn] = true
  36. for {
  37. var message Message
  38. err := conn.ReadJSON(&message)
  39. if err != nil {
  40. log.Printf("ReadJSON error: %v\n", err)
  41. delete(clients, conn)
  42. break
  43. }
  44. log.Printf("Received message from %s: %s\n", message.Username, message.Message)
  45. broadcast <- message
  46. }
  47. }
  48. func startBroadcast() {
  49. for {
  50. message := <-broadcast
  51. log.Printf("Broadcasting message from %s: %s\n", message.Username, message.Message)
  52. for client := range clients {
  53. err := client.WriteJSON(message)
  54. if err != nil {
  55. log.Printf("WriteJSON error: %v\n", err)
  56. client.Close()
  57. delete(clients, client)
  58. }
  59. }
  60. }
  61. }

客户端代码(client.go):

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "net/url"
  7. "os"
  8. "github.com/gorilla/websocket"
  9. )
  10. func main() {
  11. reader := bufio.NewReader(os.Stdin)
  12. fmt.Print("Enter your username: ")
  13. username, _ := reader.ReadString('\n')
  14. u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
  15. log.Printf("Connecting to server %s...", u.String())
  16. conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  17. if err != nil {
  18. log.Fatal("Dial error:", err)
  19. }
  20. defer conn.Close()
  21. go receiveMessages(conn)
  22. for {
  23. fmt.Print("Enter message (or 'exit' to quit): ")
  24. message, _ := reader.ReadString('\n')
  25. if message == "exit\n" {
  26. break
  27. }
  28. err = conn.WriteJSON(Message{
  29. Username: username,
  30. Message: message,
  31. })
  32. if err != nil {
  33. log.Printf("WriteJSON error: %v\n", err)
  34. break
  35. }
  36. }
  37. log.Println("Disconnected from server")
  38. }
  39. func receiveMessages(conn *websocket.Conn) {
  40. for {
  41. var message Message
  42. err := conn.ReadJSON(&message)
  43. if err != nil {
  44. log.Printf("ReadJSON error: %v\n", err)
  45. break
  46. }
  47. log.Printf("[%s] %s\n", message.Username, message.Message)
  48. }
  49. }

以上示例使用了gorilla/websocket库来处理WebSocket连接和消息传递。在运行代码之前,请确保已经安装了该依赖项(可以通过 go get github.com/gorilla/websocket 命令进行安装)。

你可以根据需要修改服务器和客户端代码,并进一步扩展它们以满足你的需求。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=17143

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?