ZBLOG

golang 实现一个websocket server

package main

import (

  1. "fmt"
  2. "net/http"
  3. "github.com/gorilla/websocket"

)

var clients = make(map[*websocket.Conn]bool) // connected clients var broadcast = make(chan Message) // broadcast channel

// Configure the upgrader var upgrader = websocket.Upgrader{}

// Define our message object type Message struct {

  1. Email string `json:"email"`
  2. Username string `json:"username"`
  3. Message string `json:"message"`

}

func main() {

  1. // Create a simple file server
  2. fs := http.FileServer(http.Dir("public"))
  3. http.Handle("/", fs)
  4. // Configure websocket route
  5. http.HandleFunc("/ws", handleConnections)
  6. // Start listening for incoming chat messages
  7. go handleMessages()
  8. // Start the server on localhost port 8000 and log any errors
  9. fmt.Println("http server started on :8000")
  10. err := http.ListenAndServe(":8000", nil)
  11. if err != nil {
  12. fmt.Println("listen error:", err)
  13. }

}

func handleConnections(w http.ResponseWriter, r *http.Request) {

  1. // Upgrade initial GET request to a websocket
  2. ws, err := upgrader.Upgrade(w, r, nil)
  3. if err != nil {
  4. fmt.Println(err)
  5. }
  6. // Make sure we close the connection when the function returns
  7. defer ws.Close()
  8. // Register our new client
  9. clients[ws] = true
  10. for {
  11. var msg Message
  12. // Read in a new message as JSON and map it to a Message object
  13. err := ws.ReadJSON(&msg)
  14. if err != nil {
  15. fmt.Printf("error: %v", err)
  16. delete(clients, ws)
  17. break
  18. }
  19. // Send the new message to the broadcast channel
  20. broadcast <- msg
  21. }

}

func handleMessages() {

  1. for {
  2. // Grab the next message from the broadcast channel
  3. msg := <-broadcast
  4. // Send it out to every client that is currently connected
  5. for client := range clients {
  6. err := client.WriteJSON(msg)
  7. if err != nil {
  8. fmt.Printf("error: %v", err)
  9. client.Close()
  10. delete(clients, client)
  11. }
  12. }
  13. }

}

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?