Go WebSocket はどのようにメッセージ形式を拡張およびカスタマイズしますか?

WBOY
リリース: 2024-06-01 17:29:02
オリジナル
453 人が閲覧しました

はい、MessageHandler またはサブプロトコルを使用して Go WebSocket メッセージ形式をカスタマイズできます。 MessageHandler を使用すると、メッセージ処理ロジックを直接定義できます。一方、サブプロトコルは、接続を確立する前にサブプロトコルをネゴシエートする方法を提供します。具体的な手順は次のとおりです。 MessageHandler を使用してメッセージ形式をカスタマイズします。 新しい WebSocketConn を作成し、それをアップグレーダーに渡します。WebSocket は、MessageHandler インターフェイスで OnMessage メソッドと OnOpen メソッドを定義し、メッセージ処理と接続確立処理ロジックをカスタマイズします。サブプロトコルのネゴシエーション: サブプロトコルの転送 アップグレーダーに渡されるパラメーターは、WebSocketConn の Subprotocol() メソッドを通じて、特定のプロトコルにアクセスします。これらのメソッドを通じて、特定のニーズに応じて Go WebSocket のメッセージ形式を簡単に拡張およびカスタマイズできます。

Go WebSocket 如何扩展和自定义消息格式?

Go WebSocket メッセージ形式のカスタマイズ

WebSocket は、クライアントとサーバー間の全二重通信チャネルの確立を可能にするプロトコルです。 WebSocket メッセージは通常、JSON 形式を使用して送信されますが、メッセージ形式のカスタマイズが必要になる場合があります。 Go には、これを実現するためのいくつかの方法が用意されています。

MessageHandler の使用

MessageHandler インターフェースは 2 つのメソッドを定義します:

type MessageHandler interface {
    // OnMessage 实现 ReadMessage 方法。
    OnMessage(message []byte)
    // OnOpen 实现对 WebSocket 连接建立的处理。
    OnOpen()
}
ログイン後にコピー

MessageHandler を使用するには、新しい WebSocketConn を作成し、それを upgrader.WebSocket に渡すことができます:

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

ws, err := upgrader.Upgrade(w, r, wsConfig, wsHandler{})
ログイン後にコピー

wsHandler は、上記で定義された MessageHandler インターフェイス。 wsHandler 应该实现上面定义的 MessageHandler 接口。

// wsHandler 定义新的消息处理程序。
type wsHandler struct{}

// OnMessage 处理新消息。
func (wsHandler) OnMessage(message []byte) {
    // 自定义消息处理逻辑
}

// OnOpen 处理连接建立。
func (wsHandler) OnOpen() {
    // 可选的连接建立处理逻辑
}
ログイン後にコピー

使用 Subprotocols

WebSocket 允许双方在建立连接之前协商子协议。要使用子协议,可以将 Subprotocols 参数传递给 upgrader:

upgrader := websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    Subprotocols:    []string{"your-protocol"},
}
ログイン後にコピー

然后,可以通过 WebSocketConn 的 Subprotocol() 方法访问确定的协议:

ws, _ := upgrader.Upgrade(w, r, wsConfig, wsHandler{})
protocol := ws.Subprotocol()
ログイン後にコピー

实战案例

假设我们希望为聊天应用程序自定义消息格式。消息将包含字段:

  • type: 消息类型(例如,text、image)。
  • sender: 发送者。
  • content: 消息内容。

我们可以创建以下自定义消息类型:

type Message struct {
    Type     string `json:"type"`
    Sender   string `json:"sender"`
    Content  string `json:"content"`
}
ログイン後にコピー

然后,我们可以更新 wsHandler

func (wsHandler) OnMessage(message []byte) {
    var msg Message
    if err := json.Unmarshal(message, &msg); err != nil {
        log.Println(err)
        return
    }

    switch msg.Type {
    case "text":
        // 处理文本消息
    case "image":
        // 处理图片消息
    default:
        log.Printf("未知消息类型:%s", msg.Type)
    }
}
ログイン後にコピー

サブプロトコルの使用

🎜🎜WebSocket を使用すると、接続を確立する前に双方がサブプロトコルをネゴシエートできます。サブプロトコルを使用するには、Subprotocols パラメーターをアップグレーダーに渡すことができます: 🎜rrreee🎜 その後、WebSocketConn の Subprotocol() メソッドを通じて決定されたプロトコルにアクセスできます: 🎜rrreee 🎜🎜実践ケース 🎜🎜🎜 チャット アプリケーションのメッセージ形式をカスタマイズしたいとします。メッセージには次のフィールドが含まれます: 🎜
  • type: メッセージ タイプ (テキスト、画像など)。
  • 送信者: 送信者。
  • content: メッセージのコンテンツ。
🎜次のカスタム メッセージ タイプを作成できます: 🎜rrreee🎜 その後、カスタム メッセージを処理するために wsHandler を更新できます: 🎜rrreee🎜これらの手順に従うことで、Go WebSocket のメッセージ形式は、特定のニーズに合わせて簡単に拡張およびカスタマイズできます。 🎜

以上がGo WebSocket はどのようにメッセージ形式を拡張およびカスタマイズしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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