2015-11-07 136 views
1

我在其上使用棘輪0.3.3,Laravel 5和PHP 5.5.9建立了一個實時的多人遊戲工作,服務器操作系統是Ubuntu Linux系統。服務器通過WebSocket(數百個用戶)向每個用戶發送每個週期約500字節的數據。 它看起來像WebSocket緩衝請求並一次發送5到6個請求(每個500字節)。 我們有30毫秒的週期。有沒有辦法手動設置WebSocket緩衝區設置,所以我的請求可以毫不拖延地發送?如何設置實時WebSocket緩衝區?

+0

我無法理解您的問題。你的websocket服務器會每30毫秒發送一次消息給連接的客戶端嗎?但是現在你的客戶會收到5或6條消息嗎?你是什​​麼意思「在每個週期發送每個請求」? –

+0

是我的websocket服務器每隔30毫秒向連接的客戶端發送消息。問題是這些消息不知何故排隊,並且客戶端同時得到5或6條消息。每當服務器生成它時,我都需要發送每條消息。 –

+0

聽起來像你是納格爾算法的犧牲品。我建議設置'TCP_NODELAY'標誌,但是你使用棘輪... – Ghedipunk

回答

2

我發現這個問題的解決方案。首先,IoServer類從Ratchet創建並擴展了IoServer。

class IoServer extends \Ratchet\Server\IoServer { 

    public static function factory(MessageComponentInterface $component, $port = 80, $address = '0.0.0.0') { 
     $loop = LoopFactory::create(); 
     $socket = new Reactor($loop); 
     $socket->listen($port, $address); 
     $sock = socket_import_stream($socket->master); 
     socket_set_option($sock, SOL_TCP, TCP_NODELAY, true); 

     return new static($component, $socket, $loop); 
    } 
} 
0

Azure本身對Ubuntu VM的緩衝區設置沒有任何限制。首先,我將使用此處列出的命令 - How to find the socket buffer size of linux檢查當前的緩衝區設置值。 其次,如果要配置或調整它們,你可以參考 - http://www.cyberciti.biz/faq/linux-tcp-tuning/

不知道這是你正在尋找的答案,因爲Ghedipunk指出,這可能是使用Nagle算法中的一個問題,在這種情況下,你可能想嘗試在隧道的配置加上TCP_NODELAY配置 -

插座= 1:TCP_NODELAY = 1 插座= R:TCP_NODELAY = 1

雖然我個人從來沒有與棘輪工作。

PS-我想將此添加爲評論,因爲我不確定這是否是您正在尋找的正確答案,但SO論壇不允許我添加評論。