2011-03-29 69 views
1

我想弄清楚什么是处理异步对象传输的最佳方法。C#异步对象传输(套接字?)

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

感谢您的帮助!

+0

我想知道......你必须自己做这个吗?有一些预先滚动的消息总线。哎呀,你可以使用redis来做这件很漂亮的事情(pub/sub)... – 2011-03-29 16:54:59

+0

我不必自己做。我不完全是家庭的'redis',你能否详细说明一下? – 2011-03-29 16:58:58

+0

redis是严格意义上的*(免费)缓存服务器,但它包含pub/sub。您的听众向某个指定频道发布SUBSCRIBE,发行商向该频道发布PUBLISH:因此,您发送的任何数据块都会分发给所有听众。你可以很容易地找到c#的绑定,或者我有一个完全异步的在这里,我想让杰夫让我作为一个小型项目发布... – 2011-03-29 17:03:33

回答

1

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

重新对象,我会使用protobuf-net,只是因为我知道它会产生上述消息的小二进制文件。将BLOB发送(发布)到指定的redis频道将使其分发给该频道上的所有收听者。

+0

好吧,这绝对是做事的简单方法。谢谢! – 2011-03-29 19:23:30