我试图找出解决异步对象传输的最佳方法。
我想要做的是通过连接到一台服务器的网络连接(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 :(得分:1)
就个人而言,我会把它留给消息总线/服务总线,或其他任何pub / sub。我的偏好是redis:http://redis.io/commands#pubsub
重新对象,我会使用protobuf-net,因为我知道它会为上面的消息产生微小的二进制文件。将BLOB发送(发布)到命名的redis通道将使其分发给该通道上的所有侦听器。