2016-11-14 57 views
0

是getRemote()。sendString(msg,new WriteCallback(){..})是否穩定?

class MyWebSocket extends WebSocketAdapter 

我需要發送文本1,文本2和文字3使用到的WebSocket客戶端:

getRemote().sendString(text, new WriteCallback() {...}) 

這個調用是異步,因此,我希望工作在不同的線程碼頭游泳池完成。

我的問題是:

我可以肯定地說在客戶端上的順序是一樣的:文本1,文本2和文字3?

如果是,請添加官方文檔鏈接(如果有)。


更新: 在文檔RemoteEndpoint一個可以讀取:

void sendString(String text) 
     throws IOException 

發送短信,阻塞,直到該消息的所有字節已經 發送。

void sendString(String text, 
       WriteCallback callback) 

發起文本消息的異步傳輸。該方法 可能會在消息傳輸之前返回。開發人員可能會提供 回調,以便在消息傳輸完成時得到通知,或者 導致錯誤。

因此,如果sendString帶回調,如果在同一個線程中調用回調,它如何可以是異步的?

另外,這兩種方法有什麼區別?

+0

我沒有看到回調從同一個線程調用(同步)的異步方法的註釋。我估計它是從另一個處理外出幀的線程調用的。 – Matthias247

回答

1

該調用只是將WebSocket端點的傳出文本排隊。

然後,當NIO層報告可以寫入時,排隊的消息被轉換爲幀,通過WebSocket擴展傳遞,被屏蔽(如果從客戶端發送),然後寫入套接字。

一旦將該幀的整個緩衝區寫入套接字,就會觸發WriteCallback。

這不是一個不同的線程。

只有1個線程處理寫入,它只處理隊列中的消息。

+0

謝謝!我是對的:我的線程被阻塞,直到「NIO層報告寫入可能」? – Vitaly

+0

有一個單獨的線程處理讀取,並通知您的端點。被阻塞的線程不是來自寫/ NIO,而是可能是排隊。它不是無限的,過了一段時間(由於內存壓力)入隊塊。 –