2016-08-25 13 views
9

私はオープンソースプロジェクトStorjに取り組んでいます。私は、Node.js websocketバックエンドに接続するJavaクライアントを作成しています。クライアントはTyrusを使用します。次のように通信が行く必要があります。Tyrus websocket client @OnMessage never called - Storjオープンソースプロジェクト

  • 接続
  • をクライアントが認証トークン(テキスト)を送信します。
  • サーバーからファイルが返されます(バイナリ)。
  • サーバーが接続を閉じます。

@OnMessageが呼び出されないため、問題が発生しています。私はここで同じURLに同じトークンを使って簡単なjavascriptクライアントを試しました。 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

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

 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を最新のバージョンにアップグレードしようとしましたが、私は同じ結果を得ています。何か案は?

このコードの出力は次のとおり

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のUncomment Line 152)、接続されずに他のクライアントでそのトークンを使用できるようになります。私はhttps://www.websocket.org/echo.htmlを使ってテストしました(あなたのブラウザでは安全でないURLが「wss」でないことを確認してください)。これを行うには右上のシールドをクリックする必要があります。私は、サーバーが応答しない見ることができます: Image showing the blob being received

これは、ブロブが実際にテキストメッセージに応答して送信されていることを示しているが、タイラスで@OnMessageは決して解雇なかっます。

+0

JSサーバは、「ブロブ」、これが関連している可能性/または問題としてこれを送りますか? – ThePerson

+0

何かをテスト可能にするとよいでしょう。つまり、私はサービスに接続していますが、ファイルを送信することはできません。そのため、Tyrusがサーバーからメッセージを受信できるかどうかはテストできません。とにかく、Tyrusもエコーサーバーで動作しますので、実際には有用なテストではありません。 (ちょうどあなたのtyrusクライアントに "ws://echo.websocket.org"とメッセージを送信してください)。 –

+0

ありがとうございます。うん、それは、エコーサーバーで動作しますが、エコー1私はバイトを返信するとは思わない。 storj.io(無料です)にアカウントを作成すると、 "testmain"を実行してファイルを送信してテストすることができます。残念ながら、なぜこのようなことが起こっているのか本当に困惑しています。そのため、できる限り私は7時間でこの質問に賞金を追加します。 – ThePerson

答えて

2

最後にTallNateに切り替えましたが、この問題はありません。

私は、それがいつも30秒後に私を切り離すというタイミングを見つけました。通常、応答は30年代よりも早いので、なぜそれが掛かっていて、切断されているのか分かりません。私はTyrusでタイムアウトを設定しようとしましたが、それでも30sマークで切断されました。最後に私はTallNateを試してタイムアウトを設定できるかどうかを見てみた。

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

+0

多分、他のクライアントは定期的なpingを送信するだけです(Tyrusでもサポートされています。https://tyrus.java.net/apidocs/1.13/org/glassfish/tyrus/core/TyrusSession.html#setHeartbeatInterval(long)を参照してください) –

関連する問題