【问题标题】:Connect to URL using java socket使用 java 套接字连接到 URL
【发布时间】:2015-07-08 19:14:36
【问题描述】:

我有一个 STOMP websocket 服务器接受 localhost:8080/price-stream/ws 上的连接

我正在尝试使用 Gozirra library 进行连接,它使用 java.net.socket 进行连接,但新的 Socket() 方法只接受主机和端口参数。连接代码here。有没有办法在套接字参数中定义完整的资源位置,包括 price-stream/ws 位置?

Client c;
    try {
        c = new Client("localhost", 8080, "guest", "guest");
        c.subscribe("topic/pricechannel1", new Listener() {

            @Override
            public void message(Map headers, String body) {

                System.out.println(body);
            }

        });
        c.unsubscribe("topic/pricechannel1"); // Unsubscribe all listeners
        c.disconnect();
    } catch (LoginException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

如果做不到这一点,有没有办法在服务器端转发 Spring websocket 连接请求?换句话说,我的服务器是一个运行在 tomcat 上的 Spring webapp。有没有办法可以将请求转发到我的服务器的根目录,即 localhost:8080 在这种情况下,转发到 tomcat 中的指定资源位置。我不太精通 linux 服务器配置,但我认为可以通过一些调整来实现。谢谢

【问题讨论】:

  • 没有。无法在 Socket 参数中定义资源位置。资源位置是 HTTP 的一部分,而不是 TCP。为什么不使用 HTTP API?滚动自己的 HTTP 客户端代码充满危险。
  • 我尝试使用 SSE,但我确实需要双向通信。价格流数据已经在浏览器中使用,所以我希望重新使用现有服务器来传输到 Swing GUI,并添加一些渠道供 Java GUI 使用。你会建议这是一个坏主意,我真的应该使用标准套接字进行 java -> java 通信吗?

标签: java sockets tomcat stomp


【解决方案1】:

我最终使用 Spring 4.2 StompClient 连接到我的主机,代码如下:

WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
stompClient.setMessageConverter(converter);
StompSessionHandler handler = new WSClient(); //custom implementation
String url = "ws://{URL}/ws/websocket";
stompClient.connect(url, handler);

然后将我的 WSClient 类配置为在建立连接后订阅频道。

session.subscribe("{channel name}", new StompFrameHandler() {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2022-11-10
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多