与MS.NET相比,Mono下XSockets的劣势行为

时间:2014-06-23 22:14:20

标签: mono xsockets.net

鉴于

我正在使用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");

2 个答案:

答案 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并避免发送延迟。