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:
Bu damla gerçekten kısa mesaja yanıt olarak gönderildiğini gösterir, ancak Tyrus içinde @OnMessage asla kovuluyor.
JS sunucusu bu ilgili/veya bir sorun olabilir, bir "blob" olarak gönderir? – ThePerson
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). –
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