[英]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.