繁体   English   中英

如何直接打开一个websocket到一个wss:in Java

[英]How to open a websocket directly to a wss: in Java

我正在尝试在 java 中建立一个 websocket 连接到 wss://data.tradingview.com/socket.io/websocket?from=chart%2F&date=2023_01_26-12_41&type=chart 以获取历史和当前图表数据。

我搜索并阅读了多篇文章和在线资源,但对于连接到 websocket 并获取传入数据的正确步骤感到困惑。

我找到了一个与我正在尝试做的非常接近的帖子,它打开了一个 websocket 并使用 ws 作为目标位置。 在这里我稍微修改了它以实现建议的解决方案。

import java.io.IOException;
import java.net.URI;

import javax.websocket.*;

@ClientEndpoint
public class ExampleTest2 {

    Session session;

   //Problem resolved, this original echo server is no longer operational
    //private final static String url = "ws://echo.websocket.org:80";
    private final static String url = "wss://websocket-echo.com:443/";

    public static void main(String[] args) throws Exception, IOException {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        System.out.println("connecting...");
        container.connectToServer(ExampleTest2.class,
                URI.create(url));
        
        System.out.println("Press ENTER key to exit.");
        System.in.read();
    }


    @OnMessage
    public void newMessage(String message, Session session) {
        System.out.println(message);
    }
    @OnOpen
    public void newConnection(Session session) throws IOException {
        this.session = session;
        System.out.println("The connection has been started");
        session.getBasicRemote().sendText("hello");

    }
    @OnClose
    public void disconnection() {
        System.out.println("The connection has been ended");
    }
}

这是我收到的错误 output。

Exception in thread "main" java.lang.RuntimeException: Could not find an implementation class.
    at javax.websocket.ContainerProvider.getWebSocketContainer(ContainerProvider.java:73)
    at ExampleTest2.main(ExampleTest2.java:14)

我继续搜索并找到了关于该特定错误的帖子。 这里他们的解决方案是使用不同的外部库。 我正在使用 javax.websocket-api-1.1.jar 现在我已经切换到他们推荐的 tyrus,tyrus-standalone-client-2.1.2

但是它仍然没有正确连接。

Exception in thread "main" jakarta.websocket.DeploymentException: Handshake error.
    at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:658)
    at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:696)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:849)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:493)
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:299)
    at ExampleTest2.main(ExampleTest2.java:19)
Caused by: org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 200.
    at org.glassfish.tyrus.client.TyrusClientEngine.processResponse(TyrusClientEngine.java:301)
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleHandshake(GrizzlyClientFilter.java:323)
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleRead(GrizzlyClientFilter.java:292)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:88)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:246)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:178)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:118)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:96)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:51)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:510)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:82)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:83)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:101)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:535)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:515)
    at java.base/java.lang.Thread.run(Thread.java:832)


在这一点上,我非常迷茫,我什至不确定我是否在朝着正确的方向前进,我只是在一个又一个兔子洞后面。 在这一点上,我正在尝试解决间接问题,我什至不确定是否需要它来完成我打开套接字和获取数据的任务。

将不胜感激任何与任务直接相关的帮助,例如代码示例或学习材料。

我刚刚找到了解决方案。 代码中原来的服务器不再运行。 我用这个代替“wss://websocket-echo.com:443/”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM