<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之旅 廣告
                [TOC] ## websocket握手 * WebSocket是HTML5中的協議,支持持久連接 * WebSocket 是一個雙向通信協議,它在握手階段采用 HTTP/1.1 協議(暫時不支持 HTTP/2) * WebSocket 提供兩種協議:不加密的 ws:// 和 加密的 wss:// ## Websocket API websocket 客戶端 ```jsx <!--client.html--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <script type="text/javascript"> var sock = null; var wsuri = "ws://127.0.0.1:1234"; window.onload = function () { console.log("onload"); sock = new WebSocket(wsuri); sock.onopen = function () { console.log("connected to " + wsuri); } sock.onclose = function (e) { console.log("connection closed (" + e.code + ")"); } sock.onmessage = function (e) { console.log("message received: " + e.data); } }; function send() { var msg = document.getElementById('message').value; sock.send(msg); }; </script> <h1>WebSocket Echo Test</h1> <form> <p> Message: <input id="message" type="text" value="Hello, world!"> </p> </form> <button onclick="send();">Send Message</button> </body> </html> ``` ## 握手過程 1 首先客戶端向服務端發起一個特殊的 HTTP 請求,其消息頭如下: ``` GET ws://127.0.0.1:1234/ HTTP/1.1 # 請求行 Host: 127.0.0.1:1234 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 Upgrade: websocket #服務器支持WebSocket協議它將同意 Origin: http://localhost:63342 #用于防止未認證的跨域腳本使用瀏覽器 websocket api 與服務端進行通信 Sec-WebSocket-Version: 13 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 #16bits 編碼得到的 base64 串 Sec-WebSocket-Key: FRzOf/abiWUYuiAE/QOE5Q== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits #可選:子協議協商字段 Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 ``` 2.如果服務端支持該版本的 WebSocket,會返回 101 響應,響應標頭如下: ``` HTTP/1.1 101 Switching Protocols # 狀態行 Upgrade: websocket # required Connection: Upgrade # required Sec-WebSocket-Accept: 17QAL00Qp1wMedfVeqFk0K1UwqQ= #required,加密后的 Sec-WebSocket-Key Sec-WebSocket-Protocol: chat #表明選擇的子協議 ``` ## 提供一個Golang版本的websocket Server ``` //Server.go package main import ( "fmt" "log" "net/http" "golang.org/x/net/websocket" ) func Echo(ws *websocket.Conn) { var err error for { var reply string if err = websocket.Message.Receive(ws, &reply); err != nil { fmt.Println("Can't receive") break } fmt.Println("Received back from client: " + reply) msg := "Received: " + reply fmt.Println("Sending to client: " + msg) if err = websocket.Message.Send(ws, msg); err != nil { fmt.Println("Can't send") break } } } func main() { http.Handle("/", websocket.Handler(Echo)) if err := http.ListenAndServe(":1234", nil); err != nil { log.Fatal("ListenAndServe:", err) } } ``` 啟動服務 ``` $ go run Server.go ``` 啟動客戶端, 點擊`Send Message`, client console ``` message received: Received: Hello, world! ``` Server output ``` Received back from client: Hello, world! Sending to client: Received: Hello, world! ```
                  <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>

                              哎呀哎呀视频在线观看