<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                > ### 聊天室 * main.go ~~~ package main import ( "fmt" "github.com/gorilla/websocket" "net/http" "sync" ) var cmCliConn sync.Map //所有客戶端實例 //協議升級 var ConfigUpgrade = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func chatHandler(w http.ResponseWriter, r *http.Request) { conn, err := ConfigUpgrade.Upgrade(w, r, nil) if err != nil { fmt.Println("Websocket升級失敗", "Error", err.Error()) return } client := NewChatLink(conn) cmCliConn.Store(client.conn.RemoteAddr(), client) go client.readMessage() client.writeMessage() cmCliConn.Delete(client.conn.RemoteAddr()) } func main() { //啟動Http服務,綁定監聽8001端口 http.HandleFunc("/chat", chatHandler) if err := http.ListenAndServe(":8001", nil); err != nil { fmt.Println("服務啟動失敗", "Error", err.Error()) } } ~~~ * chat\_websocket.go ~~~ package main import ( "fmt" "github.com/gorilla/websocket" "sync" ) var muChar sync.Mutex //客戶端實例鎖 type chatWebSocket struct { Sign string //唯一標識符 conn *websocket.Conn //客戶端連接實例 writeChan chan []byte //往客戶端發送數據的管道 isClose bool //連接狀態 } func NewChatLink(conn *websocket.Conn) *chatWebSocket { return &chatWebSocket{ Sign: conn.RemoteAddr().String(), conn: conn, writeChan: make(chan []byte, 2048), } } func (cli *chatWebSocket) writeChannel(data []byte) { if cli.isClose { return } cli.writeChan <- data } func (cli *chatWebSocket) readMessage() { defer cli.stop() for { _, msg, err := cli.conn.ReadMessage() if err != nil { fmt.Println("讀取數據失敗", "Error", err.Error()) break } muChar.Lock() cmCliConn.Range(func(key, value interface{}) bool { v, _ := value.(*chatWebSocket) if !v.isClose { v.writeChan <- msg } return true }) muChar.Unlock() } } func (cli *chatWebSocket) writeMessage() { for msg := range cli.writeChan { if err := cli.conn.WriteMessage(1, msg); err != nil { fmt.Println("寫入數據失敗", "Error", err.Error()) break } } } func (cli *chatWebSocket) stop() { muChar.Lock() if cli.isClose { return } cli.isClose = true //關閉客戶端實例 cli.conn.Close() //關閉寫通道 close(cli.writeChan) muChar.Unlock() } ~~~
                  <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>

                              哎呀哎呀视频在线观看