欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?實現(xiàn)?WebSockets和什么是?WebSockets

 更新時間:2022年04月24日 10:49:33   作者:宇宙之一粟  
這篇文章主要介紹了Go?實現(xiàn)?WebSockets和什么是?WebSockets,WebSockets?是構(gòu)建實時應(yīng)用程序的第一大解決方案,在線游戲、即時通訊、跟蹤應(yīng)用程序等,下文相關(guān)內(nèi)容介紹需要的小伙伴可以參考一下

前言

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

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

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

本文將解釋 WebSockets 的運作方式,然后使用 Go 語言構(gòu)建一個簡單的 WebSocket 應(yīng)用程序。

什么是 WebSockets

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

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

Go 實現(xiàn) WebSockets:1.什么是 WebSockets_客戶端

WebSockets 標(biāo)志著 Web 開發(fā)的轉(zhuǎn)折點。直到 WebSockets 的出現(xiàn),實時網(wǎng)絡(luò)難以實現(xiàn)和慢于我們習(xí)慣于現(xiàn)在;它是通過使用像 Ajax 和 Comet? ?(長)輪詢??的技術(shù)提供的技術(shù),這些輪詢沒有真正優(yōu)化用于實時應(yīng)用。

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

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

  • 實時更新。通信是單向的,服務(wù)器將低延遲(通常是頻繁的)更新流式傳輸?shù)娇蛻舳?。想想現(xiàn)場體育更新、警報、實時儀表板或位置跟蹤,僅舉幾個用例
  • 雙向通信。客戶端和服務(wù)器都發(fā)送和接收消息。示例包括聊天,虛擬事件和虛擬教室(最后兩個通常涉及輪詢,測驗和 Q&AS )等功能。WebSocket 還可用于支撐多用戶同步協(xié)作功能,例如同時編輯同一文檔的多個人員?

網(wǎng)絡(luò)套接字與 WebSockets

網(wǎng)絡(luò)套接字,或簡稱為套接字,用作在同一臺計算機或同一網(wǎng)絡(luò)上不同計算機上運行的應(yīng)用程序之間交換數(shù)據(jù)的內(nèi)部端點。

套接字是基于 Unix 和 Windows 的操作系統(tǒng)的關(guān)鍵部分,它們使開發(fā)人員更容易創(chuàng)建支持網(wǎng)絡(luò)的軟件。應(yīng)用程序開發(fā)人員可以在他們的程序中包含套接字,而不是從頭開始構(gòu)建網(wǎng)絡(luò)連接。由于網(wǎng)絡(luò)套接字用于多種網(wǎng)絡(luò)協(xié)議(HTTP、FTP 等),因此可以同時使用多個套接字。

套接字是由套接字的應(yīng)用程序編程接口 (API) 定義的一組函數(shù)調(diào)用創(chuàng)建和使用的。

有幾種類型的網(wǎng)絡(luò)套接字:

  • 數(shù)據(jù)報套接字(SOCK_DGRAM),也稱為無連接套接字,使用用戶數(shù)據(jù)報協(xié)議 (UDP)。數(shù)據(jù)報套接字支持雙向消息流并保留記錄邊界。
  • 流式套接字(SOCK_STREAM),也稱為面向連接的套接字,使用傳輸控制協(xié)議 (TCP)、流控制傳輸協(xié)議 (SCTP) 或數(shù)據(jù)報擁塞控制協(xié)議 (DCCP)。這些套接字提供雙向、可靠、有序且不重復(fù)的數(shù)據(jù)流,沒有記錄邊界。
  • 原始套接字(raw IP sockets) 通常在路由器和其他網(wǎng)絡(luò)設(shè)備中可用。這些套接字通常是面向數(shù)據(jù)報的,盡管它們的確切特性取決于協(xié)議提供的接口。大多數(shù)應(yīng)用程序不使用原始套接字。提供它們是為了支持新通信協(xié)議的開發(fā),并提供對現(xiàn)有協(xié)議更深奧的設(shè)施的訪問。

套接字通信

每個網(wǎng)絡(luò)套接字由地址標(biāo)識,地址是傳輸協(xié)議、IP 地址和端口號的三元組。

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

  • 連接到 TCP 套接字

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

Go 實現(xiàn) WebSockets:1.什么是 WebSockets_服務(wù)器_02

此連接保持有效,直到客戶端或服務(wù)器關(guān)閉它。創(chuàng)建連接的函數(shù)如下:

客戶端代碼:

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

服務(wù)端代碼:

// 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 套接字時,客戶端只需向服務(wù)器發(fā)送數(shù)據(jù)報。沒有 Accept 函數(shù),因為服務(wù)器不需要接受連接,只是等待數(shù)據(jù)報到達。

Go 實現(xiàn) WebSockets:1.什么是 WebSockets_服務(wù)器_03

其他 TCP 函數(shù)有 UDP 對應(yīng)函數(shù);只需在上面的函數(shù)中將 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
}

服務(wù)端:

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

總結(jié)

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

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

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

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

Go 實現(xiàn) WebSockets:1.什么是 WebSockets_客戶端_04

這是客戶端請求的樣子:

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

這是服務(wù)器響應(yīng):

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

WebSockets 解決了開發(fā)實時 Web 應(yīng)用程序的許多難題,并且與傳統(tǒng) HTTP 相比具有以下幾個優(yōu)點:

  • 輕量級報頭減少了數(shù)據(jù)傳輸開銷。
  • 單個 Web 客戶端只需要一個 TCP 連接。
  • WebSocket 服務(wù)器可以將數(shù)據(jù)推送到 Web 客戶端。

WebSocket 協(xié)議實現(xiàn)起來比較簡單。它使用 HTTP 協(xié)議進行初始握手。成功握手后,建立連接,WebSocket 本質(zhì)上使用原始 TCP 讀取/寫入數(shù)據(jù)。

到此這篇關(guān)于Go 實現(xiàn) WebSockets和什么是 WebSockets的文章就介紹到這了,更多相關(guān)Go 實現(xiàn) WebSockets內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個操作mysql的有點麻煩所以就使用了gorm,下面就gorm的使用做下簡單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Go 第三方庫之類型轉(zhuǎn)換問題

    Go 第三方庫之類型轉(zhuǎn)換問題

    今天給大家介紹一個第三方庫,專門處理類型轉(zhuǎn)換的問題。對Go 第三方庫之類型轉(zhuǎn)換問題感興趣的朋友跟隨小編一起看看吧
    2021-08-08
  • IdeaGo啟動報錯Failed to create JVM的問題解析

    IdeaGo啟動報錯Failed to create JVM的問題解析

    這篇文章主要介紹了IdeaGo啟動報錯Failed to create JVM的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Go并發(fā)控制WaitGroup的使用場景分析

    Go并發(fā)控制WaitGroup的使用場景分析

    WaitGroup,可理解為Wait-Goroutine-Group,即等待一組goroutine結(jié)束,本文通過具體場景結(jié)合實際例子給大家介紹使用WaitGroup控制的實現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 詳解golang各種類型是如何進行比較的

    詳解golang各種類型是如何進行比較的

    在日常開發(fā)中,比較操作是最常用的基本操作之一,可以用來判斷變量之間是否相等或者對應(yīng)的大小關(guān)系,比較操作對于排序、查找和集合數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)至關(guān)重要,本文將深入解析golang各種類型是如何進行比較的,需要的朋友可以參考下
    2024-01-01
  • golang?Gorm框架講解

    golang?Gorm框架講解

    gorm是一個使用Go語言編寫的ORM框架,這篇文章主要介紹了golang?Gorm框架,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Golang中實現(xiàn)簡單的Http Middleware

    Golang中實現(xiàn)簡單的Http Middleware

    本文主要針對Golang的內(nèi)置庫 net/http 做了簡單的擴展,實現(xiàn)簡單的Http Middleware,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • go?doudou開發(fā)單體RESTful服務(wù)快速上手教程

    go?doudou開發(fā)單體RESTful服務(wù)快速上手教程

    這篇文章主要為大家介紹了go?doudou開發(fā)單體RESTful服務(wù)快速上手教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • golang?四則運算計算器yacc歸約手寫實現(xiàn)

    golang?四則運算計算器yacc歸約手寫實現(xiàn)

    這篇文章主要為大家介紹了golang?四則運算?計算器?yacc?歸約的手寫實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • golang中import cycle not allowed解決的一種思路

    golang中import cycle not allowed解決的一種思路

    這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論