私はオープンソースプロジェクト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」でないことを確認してください)。これを行うには右上のシールドをクリックする必要があります。私は、サーバーが応答しない見ることができます:
これは、ブロブが実際にテキストメッセージに応答して送信されていることを示しているが、タイラスで@OnMessageは決して解雇なかっます。
JSサーバは、「ブロブ」、これが関連している可能性/または問題としてこれを送りますか? – ThePerson
何かをテスト可能にするとよいでしょう。つまり、私はサービスに接続していますが、ファイルを送信することはできません。そのため、Tyrusがサーバーからメッセージを受信できるかどうかはテストできません。とにかく、Tyrusもエコーサーバーで動作しますので、実際には有用なテストではありません。 (ちょうどあなたのtyrusクライアントに "ws://echo.websocket.org"とメッセージを送信してください)。 –
ありがとうございます。うん、それは、エコーサーバーで動作しますが、エコー1私はバイトを返信するとは思わない。 storj.io(無料です)にアカウントを作成すると、 "testmain"を実行してファイルを送信してテストすることができます。残念ながら、なぜこのようなことが起こっているのか本当に困惑しています。そのため、できる限り私は7時間でこの質問に賞金を追加します。 – ThePerson