我正在使用XSockets 3.0.6,我认为这是最新的稳定版本。在MS.NET下,行为符合预期。在Ubuntu 14.04和Mono 3.6.1上虽然服务器在向客户端发送消息之前有某种延迟。
在MS.NET上,当我在客户端中键入字符串并发送它时,所有客户端都会立即通知。在Mono上虽然服务器收到消息,但客户端没有立即通知。只有1条消息我等了5分钟,客户仍未收到通知。当消息变为5-6时,所有客户端将立即收到有关所有消息的通知。看起来服务器使用某种缓冲但有条件 - 取决于.NET运行时,这很奇怪。
我做错了吗?如何更改代码,以便在MS.NET中立即通知所有客户端?
我跟着(并略微修改)了快速启动示例,如下所示......
using (var container = Composable.GetExport<IXSocketServerContainer>())
{
container.StartServers();
foreach (var server in container.Servers)
{
Console.WriteLine(server.ConfigurationSetting.Endpoint);
}
Console.Write("Started! Hit 'Enter' to quit.");
Console.ReadLine();
container.StopServers();
}
public class CustomController : XSocketController
{
public override void OnMessage(ITextArgs textArgs)
{
Console.WriteLine ("No delay = {0}", this.Socket.Socket.NoDelay);
if (!this.Socket.Socket.NoDelay)
{
Socket.Socket.NoDelay = true;
}
Console.WriteLine("Received {0} about {1}.", textArgs.data, textArgs.@event);
this.SendToAll(textArgs);
}
}
var client = new XSocketClient("ws://127.0.0.1:4502/CustomController", "*");
client.OnOpen += (sender, eventArgs) => System.Console.WriteLine("OPEN");
client.Bind("foo", message => System.Console.WriteLine(message.data));
Thread.Sleep(1000);
client.Open();
string input;
System.Console.WriteLine("Type 'quit' to quit and any other string to send a message:");
do
{
input = System.Console.ReadLine();
if (input != "quit")
{
client.Send(input, "foo");
}
} while (input != "quit");
答案 0 :(得分:1)
在树莓派上运行XSockets时,我体验到了这一点。 经过一番调查后,我意识到这与pi是单核并且内部队列在发送5条消息之前没有发送消息这一事实有关......然后所有消息都被发送出去了。
您的计算机有多少个核心?
此问题已在4.0中解决(现在在alpha中)
编辑:我在Mono的单核机上遇到过这个问题,在我的Mac Book Air上一切都很适合Mono
答案 1 :(得分:1)
看起来在XSockets中未禁用Naggle Algorithm。在System.Net.Sockets中,您可以通过将Socket.NoDelay属性设置为true
来禁用Naggle算法。
我不熟悉XSockets,但如果您可以从XSockets获取基础System.Net.Sockets.Socket类,则可以将此属性设置为true
并避免发送延迟。