ホームページ >バックエンド開発 >Golang >Golang でのファイル転送に WebSocket を使用する方法

Golang でのファイル転送に WebSocket を使用する方法

王林
王林オリジナル
2023-12-18 09:06:501374ブラウズ

Golang でのファイル転送に WebSocket を使用する方法

golang でのファイル転送に WebSocket を使用する方法

WebSocket は、双方向通信をサポートし、ブラウザとサーバーの間に永続的な接続を確立できるネットワーク プロトコルです。 。 golang では、サードパーティのライブラリ Gorilla/websocket を使用して WebSocket 機能を実装できます。この記事では、ファイル転送に golang と Gorilla/WebSocket ライブラリを使用する方法を紹介します。

まず、gorilla/websocket ライブラリをインストールする必要があります。次のコマンドを使用してインストールできます。

go get github.com/gorilla/websocket

次に、WebSocket 接続を受信して​​処理するための golang サーバー側プログラムを作成します。以下はサンプル コードです。

package main

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

    "github.com/gorilla/websocket"
)

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

func main() {
    http.HandleFunc("/", handleWebSocket)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Print("upgrade error: ", err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Print("read error: ", err)
            break
        }
        fmt.Printf("received message: %s
", message)

        err = conn.WriteMessage(websocket.TextMessage, []byte("Message received!"))
        if err != nil {
            log.Print("write error: ", err)
            break
        }
    }
}

上記のコードは、WebSocket 接続リクエストを処理する HTTP 処理関数を作成します。このハンドラー関数では、まず HTTP 接続を WebSocket 接続にアップグレードし、次に無限ループに入り、クライアントからメッセージを継続的に受信し、単純な応答を返します。ここのサンプルコードではファイル転送は行わず、単にメッセージの送受信処理を示しています。

次に、サーバーに接続してファイルをサーバーに送信するための golang クライアント プログラムを作成します。サンプル コードは次のとおりです。

package main

import (
    "fmt"
    "log"
    "net/url"
    "os"

    "github.com/gorilla/websocket"
)

func main() {
    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/"}
    conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial error: ", err)
    }
    defer conn.Close()

    file, err := os.Open("test.txt")
    if err != nil {
        log.Fatal("open file error: ", err)
    }
    defer file.Close()

    fileInfo, _ := file.Stat()
    fileSize := fileInfo.Size()
    fileName := fileInfo.Name()

    err = conn.WriteMessage(websocket.TextMessage, []byte(fileName))
    if err != nil {
        log.Fatal("write error: ", err)
    }

    buffer := make([]byte, 1024)
    for {
        bytesRead, err := file.Read(buffer)
        if err != nil {
            break
        }

        err = conn.WriteMessage(websocket.BinaryMessage, buffer[:bytesRead])
        if err != nil {
            log.Fatal("write error: ", err)
        }
    }

    err = conn.WriteMessage(websocket.TextMessage, []byte("Transmission finished"))
    if err != nil {
        log.Fatal("write error: ", err)
    }

    fmt.Println("File transmission completed")
}

上記のコードは、WebSocket クライアントを作成し、サーバーに接続してファイルを送信します。このクライアントでは、最初にファイル名をサーバーに送信し、次にファイルの内容をループで読み取り、ファイルが読み取られるまでサーバーに送信します。最後に、転送が完了したことを示す終了メッセージをサーバーに送信します。

クライアント プログラムは、サーバーに送信される te​​st.txt という名前のファイルを事前に準備する必要があることに注意してください。実際のニーズに応じて、ファイル名とパスを変更できます。

上記は、ファイル転送に WebSocket を使用する簡単な例です。 Gorilla/websocket ライブラリを利用することで、WebSocket の機能を golang で簡単に実装できます。ただし、実際のアプリケーションでは、切断処理やファイルの断片化転送など、さらに多くのシナリオに対応する必要があります。開発プロセスでは、セキュリティやパフォーマンスなどの問題も考慮する必要があります。この記事があなたのお役に立ち、golang でのファイル転送に WebSocket を使用するきっかけになれば幸いです。

以上がGolang でのファイル転送に WebSocket を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。