package send import ( "encoding/json" "fmt" "log" "net/http" "github.com/gorilla/websocket" ) var up = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } var useronline = make(map[string]*websocket.Conn) type Message struct { Receiver string `json:"receiver"` Poster string `json:"poster"` Content string `json:"content"` Time string `json:"time"` } func Fasong(w http.ResponseWriter, r *http.Request) { connect, error := up.Upgrade(w, r, nil) if error != nil { log.Println(error) return } defer func() { connect.Close() }() Username := r.URL.Query().Get("username") if Username == "" { log.Println("没有该用户") connect.Close() return } fmt.Println("用户" + Username + "登录至服务器") useronline[Username] = connect for { msgtype, msg, error := connect.ReadMessage() if error != nil { if websocket.IsUnexpectedCloseError(error, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { fmt.Printf("错误:%s 用户:%s退出服务器\n", error, Username) } break } if msgtype == websocket.TextMessage { var message Message fmt.Println(message) if error := json.Unmarshal(msg, &message); error != nil { log.Println("解析失败:", error) continue } fmt.Println(message) if receiverconnect, ok := useronline[message.Receiver]; ok { sendmessage, _ := json.Marshal(message) if error := receiverconnect.WriteMessage(websocket.TextMessage, []byte(sendmessage)); error != nil { log.Println("信息发送失败") } else { } } if msgtype == websocket.BinaryMessage { fmt.Println(msg) } } if msgtype == websocket.BinaryMessage { fmt.Println(msg) } } }