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客户端,无需额外框架:
- 创建客户端端点类,处理连接、消息、错误事件:
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(); } }
- 发起连接,客户端库会自动完成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客户端简化开发:
- 添加Maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
- 编写客户端连接代码:
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
相关产品推荐
相关产品推荐

