C#异步对象传输(套接字?)

时间:2011-03-29 16:50:29

标签: c# tcp asyncsocket

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

我想要做的是通过连接到一台服务器的网络连接(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);
        }
    }

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

我知道我应该尝试从_clients中的所有套接字接收数据,一旦我收到数据,我需要将其转发到_clinets中的所有其他套接字,但我应该如何做这个?当客户端终止其连接时,我应该如何以及在何处检测到它?

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

重新对象,我会使用protobuf-net,因为我知道它会为上面的消息产生微小的二进制文件。将BLOB发送(发布)到命名的redis通道将使其分发给该通道上的所有侦听器。