2016-08-25 18 views
9

Açık kaynak projesi Storj. Bir Node.js websocket arka ucuna bağlanan bir Java istemcisi yazıyorum. Müşteri Tyrus'u kullanıyor. olarak gitmeli iletişim aşağıdaki gibidir:Tyrus websocket istemcisi @OnMessage hiç çağrılmadı - Storj Açık kaynaklı proje

  • Bağlan
  • Müşteri Yetkilendirme jetonu (metin) gönderir.
  • Sunucu bir dosya geri gönderir (ikili).
  • Sunucu, bağlantıyı kapatır.

@OnMessage'im asla çağrılmadığı için sorun yaşıyorum. Ben aynı URL'ye ve aynı şekilde çevrimiçi Burada basit javascript müşteri ile çalıştık: https://www.websocket.org/echo.html

bir şey Java projesi ile yanlış bilgiler gösteriyor bu kullanarak bir yanıt, olsun.

Dosyayı indirmeden önce, daha önceki bir aşamada, dosyayı sorunsuz bir şekilde yükleyebildim. Ancak, bu adım çağrılacak bir @OnMessage gerektirmez (Sadece dosyayı yükler ve sonra sunucu bir ileti ile bağlantısını keser), bu yüzden @OnMessage'ımın çalışıp çalışmadığından emin değilim. burada mevcut 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(); 
    } 
} 

Ve bu WebSocket'e başladı kodu 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); 
     } 

Ben İşte

ilgili (Github üzerinde mevcut Ayrıca) WebSocket'e kodudur Ayrıca en son sürüme Tyrus'u yükseltmeyi denedim ve aynı sonucu elde ettim. Herhangi bir fikir?

Bu kodun çıktısı:

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 

mesaj gönderdikten sonra, bu @OnClose gelen "NORMAL_CLOSURE" mesajı önce bir süre asılı kalır.

Güncelleme: Ben git deposuna bir test kullanıcı adı ve parola ekledim konuyu

çoğaltmak için bu çalıştırmak için gerçekten kolay bir yolu, bu nedenle mevcut kod buradadır: https://github.com/NutterzUK/storj-java-bridge-client

için Çalıştırın, sadece çalıştırmanız gerekir. storj.io.client.main.MainTest

Ne yaptığıyla ilgili hızlı bir çalışma. İlk olarak bir jeton almak için bazı HTTP istekleri gönderilir. Bir kullanıcının makinesine bir web bağlantısı aracılığıyla bağlanmak için bu belirteci kullanır ve bu belirteci metin olarak gönderir. Yanıt olarak, bir dosyayı bayt olarak almalıdır.

Bağlamadan önce, belirteci ve bağlanacağı adres yazdırılır. Kapatılmadan önce biraz bekleyecek ve onMessage yöntemi hiç çağrılmadı. Test için, orada bir System.exit yerleştirirseniz (Uncomment Line 152, DefaultStorjClient.java), bağlanamaz, böylece başka bir istemcide bu belirteci kullanabilirsiniz. https://www.websocket.org/echo.html kullanarak test ettim (Tarayıcınızın güvenli olmayan URL'lere "wss" olmadığından emin olun. Bunu Chrome'da yapmak için sağ üstteki kalkanı tıklamanız gerekir.Sunucu yanıt vermez görebilirsiniz: Image showing the blob being received

Bu damla gerçekten kısa mesaja yanıt olarak gönderildiğini gösterir, ancak Tyrus içinde @OnMessage asla kovuluyor.

+0

JS sunucusu bu ilgili/veya bir sorun olabilir, bir "blob" olarak gönderir? – ThePerson

+0

Test edilebilir birşeye sahip olmak güzel olurdu. Demek istediğim .. Servise bağlandım, ama bana bir dosya yollayamıyorum, bu yüzden Tyrus'un sunucunuzdan bir mesaj alıp alamayacağını test edemem. Her neyse, Tyrus da eko sunucusuyla çalışıyor, bu yüzden gerçekten kullanışlı bir test değil. (sadece tyrus istemcinizi "ws: //echo.websocket.org" a yönlendirin ve bir mesaj gönderin). –

+0

Teşekkürler. Evet, yankı sunucusuyla çalışıyor, ama sanırım yankı özgeçmiş geri bayt gönderir. Eğer storj.io (ücretsiz) bir hesap yaparsanız, "testmain" 'i çalıştırabilir ve test etmek için bir dosya gönderebilirsiniz. Her şey github üzerindeydi, ne yazık ki bu olayın neden olduğu konusunda çok şaşırdım, bu yüzden 7 saat içinde bu soruya bir nimet ekleyeceğim. – ThePerson

cevap

2

Sonunda TallNate'e geçtim ve bu sorun mevcut değil.

Zamanlamadan sonra, 30 saniye sonra her zaman bağlantımın kesildiğini buldum. Genellikle yanıtlar 30'lardan daha hızlıdır, bu yüzden neden asılı olduğunu ve bağlantının kesildiğini bilmiyorum. Zaman aşımını Tyrus'ta ayarlamayı denedim ama yine de 30s işareti ile bağlantısı kesildi. Sonunda, orada zaman aşımı ayarlayıp yapamayacağımı görmek için TallNate'i denedim.

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

+0

asıl sebebi buldunuz mu? Belki diğer müşteri sadece periyodik pingler gönderir (Tyrus'da da desteklenir, bkz. Https://tyrus.java.net/apidocs/1.13/org/glassfish/tyrus/core/TyrusSession.html#setHeartbeatInterval(long) –

İlgili konular