インターネットの発展に伴い、長距離接続技術がネットワーク通信に徐々に適用されてきました。実際のアプリケーションでは、クライアントとの通信接続を長期間維持する必要がある場合があり、この場合は長時間接続テクノロジを使用する必要があります。人気のあるプログラミング言語である golang は、同時実行性とパフォーマンスが高いため、長い接続を実装するのに最適です。この記事では、golangを使って長時間接続を実現する方法を紹介します。
1. 長い接続とは何ですか?
長い接続とは、クライアントがサーバーとの接続を確立した後、複数のデータ パケットを継続的に送信できることを意味します。この接続では、サーバーは切断されませんが、常にクライアントからの新しい要求を待機して応答します。この送信方法は、インスタント メッセージング、サーバー プッシュ データなどのネットワーク通信で広く使用されています。
短い接続と比較すると、長い接続の利点は、接続の確立と切断にかかる時間とリソースのオーバーヘッドが削減され、データ送信の効率とリアルタイム性が向上することです。
2. golang でロング接続を実装する方法
golang でロング接続を実装するには、主に 3 つの方法があります:
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
ループを使用して接続を継続します。
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 ループを使用して接続を継続します。
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()毎回接続にデータを書き込みます。
以上がGolang は長い接続を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。