我想弄清楚什么是处理异步对象传输的最佳方法。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?
感谢您的帮助!
我想知道......你必须自己做这个吗?有一些预先滚动的消息总线。哎呀,你可以使用redis来做这件很漂亮的事情(pub/sub)... – 2011-03-29 16:54:59
我不必自己做。我不完全是家庭的'redis',你能否详细说明一下? – 2011-03-29 16:58:58
redis是严格意义上的*(免费)缓存服务器,但它包含pub/sub。您的听众向某个指定频道发布SUBSCRIBE,发行商向该频道发布PUBLISH:因此,您发送的任何数据块都会分发给所有听众。你可以很容易地找到c#的绑定,或者我有一个完全异步的在这里,我想让杰夫让我作为一个小型项目发布... – 2011-03-29 17:03:33