1

给定

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

2 回答 2

1

看起来Naggle 算法在 XSockets 中没有被禁用。在 System.Net.Sockets 中,您可以通过将 Socket.NoDelay属性设置为 来禁用 Naggle 算法true。我对 XSockets 不熟悉,但是如果你可以从 XSockets 中获取底层 System.Net.Sockets.Socket 类,你可以设置这个属性来true避免发送延迟。

于 2014-06-24T10:10:52.103 回答
1

我在树莓派上运行 XSockets 时亲身体验过。经过一番调查,我意识到这与 pi 是单核的事实有关,并且内部队列在发送 5 条消息之前没有发送消息......然后所有消息都被发送出去。

你的电脑有几个核心?

这个问题在 4.0 中得到解决(现在是 alpha 版本)

编辑:我只在使用 Mono 的单核机器上遇到过这个问题,在我的 Mac Book Air 上,一切都在 Mono 上运行良好

于 2014-06-24T04:28:40.840 回答