2015-09-04 103 views
0

我使用tyrus websocket客戶端(1.11)連接到websocket。獲得「未收到握手響應」。關閉websocket後

compile 'org.glassfish.tyrus:tyrus-client:1.+' 
compile 'org.glassfish.tyrus:tyrus-container-grizzly-client:1.+' 

我運行一個本地wscat服務器(wscat --listen)來測試我的連接。

我的客戶端所做的是連接到websocket,發送一個文本字符串,然後是二進制加載(0xb5,0xb2,0xb1,0xb0,0xb1,0xb2,0xc6),然後是另一個字符串,然後斷開連接。

這是服務器看到什麼(這正是我期望的那樣):

listening on port 8666 (press CTRL+C to quit) 
client connected 
< Ohai, Server! 
< ������� 
< Bye, Server! 
disconnected 

:實體做連接,該Monkey類擴展Thread和異步運行,因此一些日誌行可能失靈。

雖然客戶端的東西並不像桃子一樣。雖然日誌同意連接製成,三個大塊進行發送,並且連接被關閉,這也給了我一個堆棧跟蹤是連接失敗,因爲沒有握手迴應收到(查看完整的日誌here):

... 
[org.glassfish.tyrus.client.TyrusClientEngine] FINE: > Session af609b3f-2978-453f-9758-10351d5ed2af [43 ms]: Sending handshake request: 
> GET ws://127.0.0.1:8666 
> Connection: Upgrade 
> Host: 127.0.0.1:8666 
> Origin: 127.0.0.1:8666 
> Sec-WebSocket-Key: pGNihDxLIbQqcxvMTBERSQ== 
> Sec-WebSocket-Protocol: binary 
> Sec-WebSocket-Version: 13 
> Upgrade: websocket 

[org.glassfish.tyrus.client.TyrusClientEngine] FINE: < Session af609b3f-2978-453f-9758-10351d5ed2af [324 ms]: Received handshake response: 
< 101 
< connection: Upgrade 
< sec-websocket-accept: EZjq5dEOzWz2q46tKtNlVD8K+mk= 
< sec-websocket-protocol: binary 
< upgrade: websocket 
... 
[MONKEY_0] FINER: Session 'af609b3f-2978-453f-9758-10351d5ed2af' opened 
[RUNNER] INFO: MONKEY_0 connected 
[MONKEY_0] FINER: Sending messages... 
[MONKEY_0] FINER: Saying Hi... 
[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [335 ms]: Sending text message: Ohai, Server! 
... 
[MONKEY_0] FINER: Said Hi. Now Sending binary data... 
[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [342 ms]: Sending binary message 
[MONKEY_0] FINER: Binary sent. Saying Bye... 
[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [344 ms]: Sending text message: Bye, Server! 
[MONKEY_0] FINER: Messages sent. 
[MONKEY_0] INFO: Closing socket. 
[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINE: Close public void close(CloseReason cr): CloseReason[1000,Bye] 
... 
[MONKEY_0] FINER: Session 'af609b3f-2978-453f-9758-10351d5ed2af' closed (Bye) 
[RUNNER] INFO: MONKEY_0 disconnected 
[MONKEY_0] SEVERE: Unable to connect to 'ws://127.0.0.1:8666' 
javax.websocket.DeploymentException: Handshake response not received. 
    at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:691) 
    at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:712) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:866) 
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) 
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:511) 
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:373) 
    at com.redacted.webmonkey.monkey.Monkey.connect(Monkey.java:90) 
    at com.redacted.webmonkey.monkey.Monkey.run(Monkey.java:47) 
Caused by: java.lang.InterruptedException 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1039) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328) 
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277) 
    at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:666) 
    ... 9 more 
... 
[RUNNER] SEVERE: 'MONKEY_0' failed. Error: Cannot connect 
... 

爲什麼有明顯的第二次嘗試連接? 這是怎麼回事?

我在幾個時間戳扔,看看有什麼實際發生的:

Session s = null; 
try { 
    LOG.d("(%d) attempting to connect", System.currentTimeMillis()); 
    WebSocketContainer wsc = ContainerProvider.getWebSocketContainer(); 
    s = wsc.connectToServer(this, uri); 
    LOG.d("(%d) Connected", System.currentTimeMillis()); 
} catch (Exception e) { 
    LOG.e("(%d) Unable to connect to '%s'", System.currentTimeMillis(), uri); 
    e.printStackTrace(); 
} 

LOG.d("(%d) Session id : %s", System.currentTimeMillis(), s == null ? null : s.getId()); 
return s != null; 

我真正得到提示,我無法連接(?但我沒有和發送這些消息,我沒有)

[MONKEY_0] FINER: (1441396510763) attempting to connect 
[MONKEY_0] FINER: (1441396511068) Session '4c0b1f6e-de7e-471d-a801-f807895c4a0b' opened 
[MONKEY_0] FINER: (1441396511079) Session '4c0b1f6e-de7e-471d-a801-f807895c4a0b' closed (Bye) 
[MONKEY_0] SEVERE: (1441396511080) Unable to connect to 'ws://127.0.0.1:8666' 
[MONKEY_0] FINER: (1441396511081) Session id : null 

看起來連接呼叫在我與ws進行交易時被阻止。它是否假設有錯誤,因爲在onOpen回調結束時連接已關閉?

+0

你能明確地設置依賴版本到1.11嗎?看起來你可能會使用更舊的東西.. –

+0

版本號實際上來自IDE中顯示的內容,但我也會嘗試一個明確的版本。 – copolii

回答

0

OK,這樣看來,onOpen回調期間關閉會話確實是原因爲什麼WebsocketContainer會很困惑,認爲連接失敗。 僅用於測試,我使用getBasicRemote()(同步)發送消息,然後在完成所有操作後關閉套接字。 我切換到使用getAsyncRemote()並關閉所有消息發送後,現在wsc正確報告連接成功。

我想知道阻止回調是否是個好主意?

0

不要在onOpen(Session session, EndpointConfig endpointConfig)內撥打Thread.sleep()。用你自己的線程發送消息,ClientManager.connect返回Session對象,用這個對象發送消息。

相關問題