websocket: クライアントが websocket プロトコルを使用していません: 「接続」ヘッダーに「アップグレード」トークンが見つかりません

王林
リリース: 2024-02-09 14:24:10
転載
1220 人が閲覧しました

websocket:客户端未使用 websocket 协议:“连接”标头中未找到“升级”令牌

WebSocket 接続を行うときに、「クライアントは WebSocket プロトコルを使用していません: 'アップグレード' トークンが '接続' ヘッダーに見つかりません」というエラーが表示されることがあります。このエラーは通常、クライアントが WebSocket プロトコルを正しく使用していないことが原因で発生します。 WebSocket は、接続を確立するための特別なハンドシェイク プロセスを使用して、クライアントとサーバー間の双方向通信を可能にするプロトコルです。ハンドシェイク中に、クライアントは WebSocket プロトコルの使用を示すために「Upgrade」ヘッダーを適切に送信する必要があります。クライアントがこのヘッダーを正しく送信しない場合、サーバーは上記のエラーを返します。 PHP エディター Baicao は、WebSocket 接続をスムーズに進めるために、この問題を解決する方法をこの記事で詳しく紹介します。

質問内容

goとJavaScriptフロントエンドで書かれたサーバーへのWebSocket接続を確立しようとしています。ディレクトリに次のファイルがあります:

main.go インデックス.html

**これは main.go の私の go コードです: **

リーリー

これは、index.html の HTML と JavaScript です:

リーリー

ただし、go run main.go を使用して実行すると、次のエラーが発生します:

リーリー

ドイツ語の意味は「既存の接続はホスト ソフトウェアの制御により終了する」です

何かが欠けていますが、何が問題なのかを理解できるほど私の理解は深くありません。ご協力をよろしくお願いいたします。

私の JS WebSocket にアップグレードが欠けているのではないかと思いましたが、Chrome では、リクエスト URL ws://localhost:9100/ws の次のリクエスト ヘッダーに「upgrade:websocket」と表示されていることがわかります。

package main


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

    "github.com/gorilla/websocket"
)

var upgrader = websocket.upgrader{
    readbuffersize:  1024,
    writebuffersize: 1024,
}

func homepage(w http.responsewriter, r *http.request) {
    http.servefile(w, r, "./index.html")
    conn, err := upgrader.upgrade(w, r, nil)
    if err != nil {
        log.println("error in handler:", err)
        return
    }
    log.println("client connected.")

    for {
        messagetype, p, err := conn.readmessage()
        if err != nil {
            log.println("fehler in readmessage: ", err)
            return
        }

        log.println(string(p))

        //echo message to client
        if err := conn.writemessage(messagetype, p); err != nil {
            log.println(err)
            return
        }
    }
}

func setuproutes() {
    http.handlefunc("/ws", homepage)
}

func main() {
    fmt.println("server gestartet")
    setuproutes()
    log.fatal(http.listenandserve(":9100", nil))

}
ログイン後にコピー

解決策

cerise limón さんの有益なコメントのおかげで修正することができました。問題は、ファイルのインデックス作成用に 1 つのエンドポイントが必要であり、WebSocket 用にもう 1 つのエンドポイントが必要であることです。そこで、関連する部分を次のように変更しました。 リーリー

以上がwebsocket: クライアントが websocket プロトコルを使用していません: 「接続」ヘッダーに「アップグレード」トークンが見つかりませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!