1

我试图找出处理异步对象传输的最佳方法。

我想要做的是通过连接到一台服务器的网络连接(5-10 个客户端)打开同一应用程序的多个实例,当其中一个应用程序更新其数据时,我需要将该更新传输给所有其他实例。

更新对象将与此类似:

public class UpdateData
{
    public double Angle { get; set; }
    public double Azimuth { get; set; }
    public Point Position { get; set; }
    public Guid ObjectGuid { get; set; }
}

数据不会很大,但是这种类型的对象每秒会从每个客户端传输大约 10-50 次到所有其他客户端。

处理这种数据传输的最佳方式是什么?

我在想的是让服务器对象使用类似于以下内容来监听和接受连接:

    private void BtConnectClick(object sender, EventArgs e)
    {
        int port;

        if (!int.TryParse(tbPort.Text, out port))
        {
            MessageBox.Show("Please enter a valid port into the textbox");
            tbPort.Text = "";
            return;
        }

        try
        {
            _listener = new TcpListener(IPAddress.Any, port);
            _listener.Start();

            _listener.BeginAcceptSocket(OnClientConnect, _listener);

        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }

    }

    public void OnClientConnect(IAsyncResult asyn)
    {
        try
        {
            var s = _listener.EndAcceptSocket(asyn);

            _clients.Add(s);  // List<Socket> object
        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

但是服务器应该如何处理数据传输呢?

我知道我应该尝试从 in 的所有套接字_clients接收数据,一旦我接收到数据,我需要将其转发到 in 的所有其他套接字_clinets,但我应该怎么做呢?我应该如何以及在哪里检测客户端何时终止其连接?

此外,客户端应该监听从服务器接收的数据以及向服务器发送数据。我可以用一个插座处理所有这些,还是应该使用 2 个?

谢谢你的帮助!

4

1 回答 1

1

就我个人而言,我会把它留给消息总线/服务总线,或者其他任何带有 pub/sub 的东西。我的偏好是 redis:http ://redis.io/commands#pubsub

对于对象,我会使用 protobuf-net,只是因为我知道它会为上述消息生成微小的二进制文件。发送(PUBLISH)一个 BLOB 到一个命名的 redis 通道将导致它被分发到该通道上的所有侦听器。

于 2011-03-29T17:07:14.540 回答