Go 實現 WebSockets:1. 什么是 WebSockets

      網友投稿 925 2025-03-31

      前言

      日常工作中,在不刷新頁面的情況下發送消息并獲得即時響應是我們認為理所當然的事情。但在過去,啟用實時功能對開發人員來說是一個真正的挑戰。開發者社區從 HTTP 長輪詢和 AJAX 走過了漫長的道路,終于找到了構建真正實時應用程序的解決方案。

      這個解決方案以 WebSockets 的形式出現,它可以在用戶的瀏覽器和服務器之間打開一個交互式會話。 WebSockets 允許瀏覽器向服務器發送消息并接收事件驅動的響應,而無需輪詢服務器以獲取回復。

      目前,WebSockets 是構建實時應用程序的第一大解決方案:在線游戲、即時通訊、跟蹤應用程序等。

      本文將解釋 WebSockets 的運作方式,然后使用 Go 語言構建一個簡單的 WebSocket 應用程序。

      什么是 WebSockets

      簡而言之,WebSocket是一種 Web 技術,可以通過持久的單個套接字連接實現客戶端和服務器之間的雙向,全雙工通信。WebSocket 是為 Web 應用程序開發人員提供基本上是一個接近原始的TCP通信層。

      WebSocket 連接以 HTTP 請求/響應握手啟動。如果此初始握手成功,則客戶端和服務器已同意使用為 HTTP 請求作為 WebSocket 連接建立的現有 TCP / IP 連接。只要需要一旦 WebSocket 連接服務了它的目的,它可以通過關閉握手終止,客戶端和服務器都可以啟動。

      WebSockets 標志著 Web 開發的轉折點。直到 WebSockets 的出現,實時網絡難以實現和慢于我們習慣于現在;它是通過使用像 Ajax 和 Comet(長)輪詢的技術提供的技術,這些輪詢沒有真正優化用于實時應用。

      WebSocket 技術具有廣泛的適用性。您可以在不同的目的中使用它,例如后端服務之間的流數據,或者通過長期的全雙工連接連接前端。簡而言之,WebSockets 是架構事件驅動的系統和構建實時應用程序和服務的絕佳選擇,在那里它必須隨時隨地提供數據所必需的數據。

      我們可以將 WebSocket 用例大致分為兩個不同的類別:

      **實時更新。**通信是單向的,服務器將低延遲(通常是頻繁的)更新流式傳輸到客戶端。想想現場體育更新、警報、實時儀表板或位置跟蹤,僅舉幾個用例

      雙向通信。客戶端和服務器都發送和接收消息。示例包括聊天,虛擬事件和虛擬教室(最后兩個通常涉及輪詢,測驗和 Q&AS )等功能。WebSocket 還可用于支撐多用戶同步協作功能,例如同時編輯同一文檔的多個人員

      網絡套接字與 WebSockets

      網絡套接字,或簡稱為套接字,用作在同一臺計算機或同一網絡上不同計算機上運行的應用程序之間交換數據的內部端點。

      套接字是基于 Unix 和 Windows 的操作系統的關鍵部分,它們使開發人員更容易創建支持網絡的軟件。應用程序開發人員可以在他們的程序中包含套接字,而不是從頭開始構建網絡連接。由于網絡套接字用于多種網絡協議(HTTP、FTP 等),因此可以同時使用多個套接字。

      套接字是由套接字的應用程序編程接口 (API) 定義的一組函數調用創建和使用的。

      有幾種類型的網絡套接字:

      數據報套接字(SOCK_DGRAM) ,也稱為無連接套接字,使用用戶數據報協議 (UDP)。數據報套接字支持雙向消息流并保留記錄邊界。

      流式套接字(SOCK_STREAM) ,也稱為面向連接的套接字,使用傳輸控制協議 (TCP)、流控制傳輸協議 (SCTP) 或數據報擁塞控制協議 (DCCP)。這些套接字提供雙向、可靠、有序且不重復的數據流,沒有記錄邊界。

      原始套接字(raw IP sockets) 通常在路由器和其他網絡設備中可用。這些套接字通常是面向數據報的,盡管它們的確切特性取決于協議提供的接口。大多數應用程序不使用原始套接字。提供它們是為了支持新通信協議的開發,并提供對現有協議更深奧的設施的訪問。

      套接字通信

      每個網絡套接字由地址標識,地址是傳輸協議、IP 地址和端口號的三元組。

      主機之間的通信主要有兩種協議:TCP 和 UDP。讓我們看看您的應用程序如何連接到 TCP 和 UDP 套接字。

      Go 實現 WebSockets:1. 什么是 WebSockets

      連接到 TCP 套接字

      為了建立 TCP 連接,Go 客戶端使用 net 包中的 DialTCP 函數。 DialTCP 返回一個 TCPConn 對象。建立連接后,客戶端和服務器開始交換數據:客戶端通過 TCPConn 對象向服務器發送請求,服務器解析請求并發送響應,TCPConn 對象接收服務器的響應。

      此連接保持有效,直到客戶端或服務器關閉它。創建連接的函數如下:

      客戶端代碼:

      // init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil { // handle error } conn, err := net.DialTCP(network, nil, tcpAddr) if err != nil { // handle error } // send message _, err = conn.Write({message}) if err != nil { // handle error } // receive message var buf [{buffSize}]byte _, err := conn.Read(buf[0:]) if err != nil { // handle error }

      服務端代碼:

      // init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil { // handle error } listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil { // handle error } // listen for an incoming connection conn, err := listener.Accept() if err != nil { // handle error } // send message if _, err := conn.Write({message}); err != nil { // handle error } // receive message buf := make([]byte, 512) n, err := conn.Read(buf[0:]) if err != nil { // handle error }

      連接到 UDP 套接字

      與 TCP 套接字相比,使用 UDP 套接字時,客戶端只需向服務器發送數據報。沒有 Accept 函數,因為服務器不需要接受連接,只是等待數據報到達。

      其他 TCP 函數有 UDP 對應函數;只需在上面的函數中將 TCP 替換為 UDP 即可。

      客戶端:

      // init raddr, err := net.ResolveUDPAddr("udp", address) if err != nil { // handle error } conn, err := net.DialUDP("udp", nil, raddr) if err != nil { // handle error } ....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFrom(buffer) if err != nil { // handle error } ....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteTo(buffer[:n], addr) if err != nil { // handle error }

      服務端:

      // init udpAddr, err := net.ResolveUDPAddr(resolver, serverAddr) if err != nil { // handle error } conn, err := net.ListenUDP("udp", udpAddr) if err != nil { // handle error } ....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFromUDP(buffer) if err != nil { // handle error } ....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteToUDP(buffer[:n], addr) if err != nil { // handle error }

      總結

      WebSocket 通信包通過單個 TCP 連接提供全雙工通信通道。這意味著客戶端和服務器都可以在需要時同時發送數據而無需任何請求。

      對于需要持續數據交換的服務,例如即時通訊、在線游戲和實時交易系統,WebSockets 是一個很好的解決方案。您可以在 Internet 工程任務組 (IETF) RFC 6455 規范中找到有關 WebSocket 協議的完整信息。

      WebSocket 連接由瀏覽器請求并由服務器響應,然后建立連接。這個過程通常稱為握手。 WebSockets 中的特殊類型的標頭只需要瀏覽器和服務器之間的一次握手即可建立一個在其生命周期內保持活動狀態的連接。

      WebSocket 協議使用端口 80 進行不安全連接,使用端口 443 進行安全連接。 WebSocket 規范確定 ws (WebSocket) 和 wss (WebSocket Secure) 協議需要哪些統一的資源標識符方案。

      這是客戶端請求的樣子:

      GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com

      這是服務器響應:

      HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat

      WebSockets 解決了開發實時 Web 應用程序的許多難題,并且與傳統 HTTP 相比具有以下幾個優點:

      輕量級報頭減少了數據傳輸開銷。

      單個 Web 客戶端只需要一個 TCP 連接。

      WebSocket 服務器可以將數據推送到 Web 客戶端。

      WebSocket 協議實現起來比較簡單。它使用 HTTP 協議進行初始握手。成功握手后,建立連接,WebSocket 本質上使用原始 TCP 讀取/寫入數據。

      Go TCP/IP websocket Windows

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps office怎么升序
      下一篇:身份證輸入excel表最后四位變0000怎么辦?(身份證輸入到Excel后四位變成0000)
      相關文章
      亚洲国产成人资源在线软件| 亚洲欧洲国产成人精品| 亚洲第一区二区快射影院| 久久精品国产精品亚洲艾| 亚洲人成网亚洲欧洲无码久久| 亚洲视频在线免费| 亚洲精品无码日韩国产不卡?V | 亚洲国产综合精品中文第一区| 人人狠狠综合久久亚洲婷婷| 亚洲中文字幕久久精品无码APP | xxx毛茸茸的亚洲| 亚洲最大的黄色网| 亚洲综合色婷婷在线观看| 亚洲日本va一区二区三区| 亚洲日本va一区二区三区| 亚洲av成人无码网站…| 亚洲AV无码一区二区三区国产 | 亚洲精品国产福利在线观看| 亚洲成电影在线观看青青| 亚洲一级片在线播放| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲一区免费视频| 亚洲中文字幕无码久久2020| 亚洲大码熟女在线观看| 日批日出水久久亚洲精品tv| 亚洲天堂在线视频| 亚洲级αV无码毛片久久精品| 亚洲不卡中文字幕无码| 亚洲成a人片在线观看中文动漫| 91在线亚洲精品专区| 亚洲国产成人久久三区| 亚洲一区二区三区高清在线观看| 亚洲国产精品自在自线观看| 亚洲AV无码一区二区三区国产| 久久久久亚洲精品天堂久久久久久 | 亚洲视频在线观看视频| 亚洲一级毛片免费在线观看| 亚洲熟妇无码一区二区三区导航| 亚洲av色香蕉一区二区三区蜜桃| 亚洲男人第一无码aⅴ网站 | 亚洲中文字幕无码久久精品1|