首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tyrus websocket client @OnMessage从未调用- Storj开源项目

Tyrus websocket client @OnMessage从未调用- Storj开源项目
EN

Stack Overflow用户
提问于 2016-08-25 20:15:33
回答 1查看 825关注 0票数 9

我正在从事一个开源项目,Storj。我正在编写一个连接到Node.js websocket后端的Java。客户用泰勒斯。来文应如下:

  • 连接
  • 客户端发送auth令牌(文本)。
  • 服务器将文件发回(二进制)。
  • 服务器关闭连接。

我遇到了问题,因为我的@OnMessage从未被调用过。在这里,我尝试使用一个简单的javascript客户机访问同一个URL,并使用相同的标记:https://www.websocket.org/echo.html

我确实得到了这样的响应,这告诉我Java项目有问题。

在能够下载文件之前,在早期阶段,我可以上传该文件,没有任何问题。但是,该步骤不需要调用@OnMessage (它只是上传文件,然后服务器与消息断开连接),因此我不确定我的@OnMessage是否工作。

以下是Websocket的相关代码(也可在Github上获得):https://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io/client/websockets/WebsocketFileRetriever.java

代码语言:javascript
复制
package storj.io.client.websockets;

import com.google.gson.Gson;
import storj.io.restclient.model.FilePointer;

import javax.websocket.*;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;

import java.util.concurrent.CountDownLatch;
import java.util.logging.Logger;

/**
 * Created by steve on 12/07/2016.
 */
@ClientEndpoint
public class WebsocketFileRetriever {

    private Logger logger = Logger.getLogger(this.getClass().getName());
    private Gson gson = new Gson();
    private FilePointer filePointer;
    private File outputFile;
    private AuthorizationModel authModel;
    private CountDownLatch latch;

    public WebsocketFileRetriever(FilePointer filePointer, File outputFile, CountDownLatch latch){
        this.filePointer = filePointer;
        this.latch = latch;
        this.outputFile = outputFile;
        authModel = new AuthorizationModel();
        authModel.setToken(filePointer.getToken());
        authModel.setOperation(filePointer.getOperation());
        authModel.setHash(filePointer.getHash());
    }

    @OnMessage
    public void onMessage(String s){
        logger.info("Received ... " + s);
    }

    @OnMessage
    public void onMessage(ByteBuffer message, Session session) {
        logger.info("Received ...." + message);
    }

    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        logger.info("Opened");
        try {
            session.getBasicRemote().sendText(gson.toJson(authModel), true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        logger.info("sent: " + gson.toJson(authModel));
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.info("Closed Websocket: " + closeReason.getCloseCode() + " " + closeReason.getReasonPhrase());
        //latch.countDown();
    }

    @OnError
    public void onError(Session session, Throwable t) {
        t.printStackTrace();
    }
}

以及启动这个websocket的代码,可以在这里获得https://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io/client/DefaultStorjClient.java

代码语言:javascript
复制
        CountDownLatch latch;
        latch = new CountDownLatch(1);
        ClientManager wsClient = ClientManager.createClient();
        try {
            wsClient.setDefaultMaxBinaryMessageBufferSize(Integer.MAX_VALUE);
            wsClient.setDefaultMaxTextMessageBufferSize(Integer.MAX_VALUE);
            logger.info("CONNECTING TO: " + "ws://" + pointer.getFarmer().getAddress() + ":" + pointer.getFarmer().getPort());
            final ClientEndpointConfig cec = ClientEndpointConfig.Builder.create().build();

            wsClient.connectToServer(new WebsocketFileRetriever(pointer, encryptedOutputFile, latch), cec, new URI("ws://" + pointer.getFarmer().getAddress() + ":" + pointer.getFarmer().getPort()));
            latch.await();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

我还尝试将Tyrus升级到最新版本,并得到了相同的结果。有什么想法吗?

此代码的输出是:

代码语言:javascript
复制
    Aug 25, 2016 8:55:31 PM storj.io.client.DefaultStorjClient downloadFile
INFO: CONNECTING TO: ws://164.storj.eu:8607
Aug 25, 2016 8:55:35 PM storj.io.client.websockets.WebsocketFileRetriever onOpen
INFO: Opened
Aug 25, 2016 8:55:35 PM storj.io.client.websockets.WebsocketFileRetriever onOpen
INFO: sent: {"token":"06c36d4bac4f07ee1751068b5b2230f22e884b38","hash":"837b79bec927a1d8fa7fedd2ea0bb276e0d86e0f","operation":"PULL"}
Aug 25, 2016 8:56:11 PM storj.io.client.websockets.WebsocketFileRetriever onClose
INFO: Closed Websocket: NORMAL_CLOSURE Closing

发送消息后,在@OnClose的"NORMAL_CLOSURE“消息之前挂起一段时间。

更新:一种非常简单的运行此方法来再现问题

我在git存储库中添加了一个测试用户名和密码,所以可用的代码如下:https://github.com/NutterzUK/storj-java-bridge-client

要运行它,只需运行storj.io.client.main.MainTest

快速地浏览它所做的事情。它将首先发送一些HTTP请求以获取令牌。它将使用该令牌通过websocket连接到某人的计算机,并将该令牌作为文本发送。作为响应,它应该以字节的形式接收文件。

在连接之前,它会打印出要连接到的令牌和地址。在关闭之前,它将挂起一段时间,而且从来没有调用过onMessage方法。为了进行测试,如果您在其中放置了一个System.exit (在DefaultStorjClient.java中取消了第152号注释行),它将不会连接,因此您可以在另一个客户端中使用该令牌。我已经使用https://www.websocket.org/echo.html进行了测试(确保浏览器将允许不安全的URL,因为它不是"wss",要在Chrome中这样做,您需要单击右上角的屏蔽。我可以看到服务器确实做出了响应:

这表明,blob确实是作为对文本消息的响应而发送的,但Tyrus中的@OnMessage从未被解雇。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-28 12:34:10

最后,我转向了TallNate,而这个问题并不存在。

在计时之后,我发现它总是在30秒后断开连接。通常情况下,反应比30多岁时要快,所以我不知道为什么会挂起然后断开。我试着在Tyrus中设置超时,但它还是在30多岁的时候断开了。最后,我尝试了TallNate,看看我是否可以设置超时.从盒子里出来就成功了。

https://github.com/TooTallNate/Java-WebSocket/wiki/Drafts

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39154032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档