<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > ### 聊天室(精簡版) * 完整源代碼 : 鏈接:[https://pan.baidu.com/s/1gq7-8cifyteFtsDhYa8W7A](https://pan.baidu.com/s/1gq7-8cifyteFtsDhYa8W7A)提取碼:mtgv * 部署 : go build 生成可執行文件, 運行可執行文件。打開客戶端 login*1.html 和 login*2.html 在文本框下進行聊天。 ~~~ package main import ( "fmt" //命令行窗口下 go get github.com/gorilla/websocket 下載第三方庫 "github.com/gorilla/websocket" "net/http" ) var ch chan []byte var connList map[string]*websocket.Conn //客戶端實例(高并發下會出現并發讀或并發寫錯誤,可以加鎖或者用sync.map) //協議升級 var ConfigUpgrade = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func chatHandler(w http.ResponseWriter, r *http.Request) { //conn:客戶端連接實例 conn, err := ConfigUpgrade.Upgrade(w, r, nil) if err != nil { fmt.Println(err.Error()) delete(connList, conn.RemoteAddr().String()) return } connList[conn.RemoteAddr().String()] = conn //專門接收客戶端的消息 for { _, message, err := conn.ReadMessage() if err != nil { //讀取失敗,刪除客戶端實例 if _, ok := connList[conn.RemoteAddr().String()]; ok { delete(connList, conn.RemoteAddr().String()) } fmt.Println(err.Error()) break } ch <- message } } func main() { ch = make(chan []byte, 4096) connList = make(map[string]*websocket.Conn) //開一個協程用于將某個客戶端的消息發送到所有客戶端去 go func() { for message := range ch { for k, v := range connList { if err := v.WriteMessage(1, message); err != nil { //寫入失敗,刪除客戶端實例 if _, ok := connList[k]; ok { delete(connList, k) } fmt.Println(err.Error()) continue } } } }() //啟動Http服務,綁定監聽8001端口 http.HandleFunc("/chat", chatHandler) if err := http.ListenAndServe(":8001", nil); err != nil { fmt.Println("服務啟動失敗", "Error", err.Error()) } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看