You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang Fiber中如何将HTTP客户端/连接转换为WebSocket客户端

Java客户端连接Golang Fiber WebSocket服务的实现方案

问题背景

我使用Golang Fiber搭建了WebSocket服务,核心代码如下:

服务端路由配置

app.Use("/ws", handler.UpgradeHandler)
app.Get("/ws/:id", websocket.New(func(ws *websocket.Conn) {
    handler.MediaStreamHandler(ws)
}))

握手校验中间件UpgradeHandler

func UpgradeHandler(c *fiber.Ctx) error {
    if websocket.IsWebSocketUpgrade(c) {
        log.Info("request to open WebSockets channel")
        return c.Next()
    }
    return fiber.ErrUpgradeRequired
}

流媒体处理逻辑

func MediaStreamHandler(c *websocket.Conn) {
    ...
    for {
        if mt, buf, err = c.ReadMessage(); err != nil {
          ...
        }
        ...
    }
}

现在需要解决的问题是:Java客户端如何完成从HTTP请求到WebSocket连接的转换,实现与该服务的通信?


具体实现方案

方案1:使用Java标准WebSocket API(javax.websocket)

Java EE提供的标准API可直接实现WebSocket客户端,无需额外框架:

  1. 创建客户端端点类,处理连接、消息、错误事件:
import javax.websocket.*;
import java.net.URI;

@ClientEndpoint
public class MediaStreamClient {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket连接已建立");
        // 连接建立后可发送初始化消息,或直接等待接收流媒体数据
    }

    @OnMessage
    public void onMessage(byte[] message) {
        // 处理服务端推送的二进制流媒体数据
        System.out.println("收到流媒体数据,长度:" + message.length);
        // 此处对接你的流媒体处理逻辑
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {
        System.out.println("WebSocket连接关闭:" + reason.getReasonPhrase());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}
  1. 发起连接,客户端库会自动完成HTTP到WebSocket的升级握手:
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;

public class ClientMain {
    public static void main(String[] args) {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        String wsUrl = "ws://chat.acme.ai:80/ws/123"; // 注意使用ws://协议前缀
        try {
            Session session = container.connectToServer(MediaStreamClient.class, URI.create(wsUrl));
            // 阻塞主线程,避免客户端进程退出
            Thread.currentThread().join();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:使用Spring WebSocket客户端(Spring项目适用)

如果你的Java项目基于Spring,可使用Spring封装的WebSocket客户端简化开发:

  1. 添加Maven依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 编写客户端连接代码:
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.handler.BinaryWebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.BinaryMessage;

public class SpringWsClient {
    public static void main(String[] args) throws Exception {
        StandardWebSocketClient client = new StandardWebSocketClient();
        String wsUrl = "ws://chat.acme.ai:80/ws/123";
        
        client.execute(new BinaryWebSocketHandler() {
            @Override
            public void afterConnectionEstablished(WebSocketSession session) throws Exception {
                System.out.println("Spring WebSocket连接建立");
            }

            @Override
            protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
                byte[] payload = message.getPayload().array();
                System.out.println("收到流媒体数据,长度:" + payload.length);
                // 处理流媒体数据逻辑
            }
        }, wsUrl).get();
        
        // 保持进程运行
        Thread.currentThread().join();
    }
}

核心注意事项

  • 客户端必须使用ws://(非加密)或wss://(加密)协议前缀,而非http://,客户端库会自动处理HTTP升级握手流程,无需手动发送GET请求再转换。
  • 服务端的UpgradeHandler会自动校验WebSocket握手请求,符合协议的客户端连接会被放行到MediaStreamHandler。
  • 流媒体数据通常为二进制格式,客户端需针对性实现二进制消息的处理方法(上述代码已完成对应实现)。

内容的提问来源于stack exchange,提问作者Kode Charlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:55:00