2015-11-07 83 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论坛不允许我添加评论。