Golang は長い接続を実装します

王林
リリース: 2023-05-13 09:54:06
オリジナル
2455 人が閲覧しました

インターネットの発展に伴い、長距離接続技術がネットワーク通信に徐々に適用されてきました。実際のアプリケーションでは、クライアントとの通信接続を長期間維持する必要がある場合があり、この場合は長時間接続テクノロジを使用する必要があります。人気のあるプログラミング言語である golang は、同時実行性とパフォーマンスが高いため、長い接続を実装するのに最適です。この記事では、golangを使って長時間接続を実現する方法を紹介します。

1. 長い接続とは何ですか?

長い接続とは、クライアントがサーバーとの接続を確立した後、複数のデータ パケットを継続的に送信できることを意味します。この接続では、サーバーは切断されませんが、常にクライアントからの新しい要求を待機して応答します。この送信方法は、インスタント メッセージング、サーバー プッシュ データなどのネットワーク通信で広く使用されています。

短い接続と比較すると、長い接続の利点は、接続の確立と切断にかかる時間とリソースのオーバーヘッドが削減され、データ送信の効率とリアルタイム性が向上することです。

2. golang でロング接続を実装する方法

golang でロング接続を実装するには、主に 3 つの方法があります:

  1. TCP ロング接続を使用する

TCP ロング接続を使用してロング接続を実装するのは、golang で最も一般的で簡単な方法です。まず TCP 接続を作成し、次にその接続内でデータを転送すると、接続が閉じられるまで接続が維持されます。以下は、長い TCP 接続を使用するための基本的なコードを示しています。

package main

import (
    "fmt"
    "net"
)

func main() {
   serverAddr := "127.0.0.1:8888"
   conn, err := net.Dial("tcp", serverAddr)
   if err != nil {
       fmt.Println(err)
   }

   for {
       data := []byte("hello world")
       _, err := conn.Write(data)
       if err != nil {
           fmt.Println(err)
           break
       }

       buf := make([]byte, 1024)
       _, err = conn.Read(buf)
       if err != nil {
           fmt.Println(err)
           break
       }

       fmt.Println(string(buf))
   }
}
ログイン後にコピー

この例では、net.Dial() 関数を通じて TCP 接続を作成し、 を使用します。 conn.Write()データをサーバーに送信し、conn.Read()接続からデータを読み取ります。 for ループを使用して接続を継続します。

  1. WebSocket の長い接続を使用する

WebSocket は、単一の TCP 接続上で全二重通信を行うための通信プロトコルであり、イベントベースの対話方法を提供します。 golang では、サードパーティ ライブラリ gorilla/websocket を使用して、WebSocket の長い接続を実装できます。 WebSocket を使用して長い接続を実装するコードを見てみましょう。

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func echo(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        log.Println(string(p))
        if err = conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/echo", echo)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}
ログイン後にコピー

この例では、Upgrader を使用して HTTP 接続を WebSocket 接続にアップグレードし、その後 ## を使用します。 #conn.ReadMessage() および conn.WriteMessage() は接続内でデータを送信します。 for ループを使用して接続を継続します。

    HTTP ロング接続を使用する
HTTP ロング接続は、HTTP プロトコルに基づいたロング接続テクノロジです。 TCP 永続接続と比較して、HTTP 永続接続では HTTP 接続を確立する必要があり、この接続を通じてデータを継続的に送信できます。 golang では、

net/http ライブラリを使用して HTTP 長い接続を実装できます。以下は、HTTP 長時間接続の使用方法を示しています。

package main

import (
    "bufio"
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        http.Error(w, "Method not allowed", 405)
        return
    }
    fmt.Fprintf(w, "HTTP/1.1 200 OK
")
    fmt.Fprintf(w, "Content-Type: text/plain
")
    fmt.Fprintf(w, "Connection: keep-alive
")
    fmt.Fprintf(w, "
")

    writer := bufio.NewWriter(w)
    for {
        _, err := writer.WriteString("hello world
")
        if err != nil {
            log.Println(err)
            break
        }
        writer.Flush()
    }
}

func main() {
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}
ログイン後にコピー
この例では、HTTP 応答に

Connection: keep-alive ヘッダーを設定して HTTP 接続を継続し、次に使用します。 bufio.NewWriter()毎回接続にデータを書き込みます。

3. 適切な長い接続方法を選択するにはどうすればよいですか?

golang で長い接続を実装するには 3 つの方法がありますが、実際のニーズに応じて適切な方法を選択する必要があります。注意が必要な点は次のとおりです。

    TCP ロング接続
TCP ロング接続を使用する利点は、シンプルかつ直接的であり、長時間接続を迅速に実現できることです。 。ただし、TCP の長い接続はデータ送信中に暗号化されないため、データ パケットを毎回手動で組み立てる必要があり、同時にデータのパケット化と非同期コールバックを実装するにはカスタム プロトコルが必要です。データ量が少なく、接続数が少ないシナリオに適しています。

    WebSocket の長い接続
WebSocket の長い接続は、非同期メソッドを使用してデータを送信し、サーバーによるクライアントへのデータのプッシュをサポートし、データ送信はより柔軟です。また、パッケージをグループ化する自動パケット再機能もあります。ただし、WebSocket の長時間接続では、最初のハンドシェイク中に HTTP リクエストを送信する必要があり、これは TCP の長時間接続リクエストより 1 回多くなります。

    HTTP 永続接続
HTTP 永続接続は、初めて接続を確立するときに TCP 永続接続と同様に TCP 接続を確立する必要がありますが、これは次の方法で制御できます。データ送信中の HTTP ヘッダー 接続の持続性により、接続は複数の HTTP 要求と応答を送信できます。ただし、HTTP ロングコネクションの通信効率は、TCP ロングコネクションや WebSocket ロングコネクションに比べて若干低くなります。

4. 概要

この記事では、golang でロング接続を実装するための 3 つの方法 (TCP ロング接続、WebSocket ロング接続、HTTP ロング接続) を紹介し、それぞれの利点と適用可能なシナリオも分析します。実際の開発では、具体的なシナリオに基づいて適切な方法を選択する必要があります。長期接続技術は実用化の可能性が広く、今後はより効率的で信頼性が高く、安全な長期接続技術が登場すると考えられます。

以上がGolang は長い接続を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート