gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:52:56 25 4
gpt4 key购买 nike

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

我想做的是通过连接到一台服务器的网络连接(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 中的所有其他套接字>,但是我应该怎么做呢?我应该如何以及在何处检测客户端何时终止其连接?

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

感谢您的帮助!

最佳答案

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

关于对象,我会使用 protobuf-net,因为我知道它会为上述消息生成微小的二进制文件。将 BLOB 发送 (PUBLISH) 到指定的 Redis channel 将导致它分发给该 channel 上的所有监听器。

关于C# 异步对象传输(套接字?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com