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

C# 异步对象传输(套接字?),c#,tcp,asyncsocket,C#,Tcp,Asyncsocket,我试图找出异步对象传输的最佳方式 我想做的是,通过连接到一台服务器的网络连接(5-10个客户端),打开同一应用程序的多个实例,当其中一个应用程序更新其数据时,我需要将该更新传输到所有其他实例 更新对象将类似于此: public class UpdateData { public double Angle { get; set; } public double Azimuth { get; set; } public Point Position { get; set; }

我试图找出异步对象传输的最佳方式

我想做的是,通过连接到一台服务器的网络连接(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; }
}
    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);
        }
    }
数据不会很大,但这种类型的对象每秒将从每个客户端传输10-50次到所有其他客户端

处理这种数据传输的最佳方式是什么

我的想法是让服务器对象使用类似于以下内容的方式侦听和接受连接:

public class UpdateData
{
    public double Angle { get; set; }
    public double Azimuth { get; set; }
    public Point Position { get; set; }
    public Guid ObjectGuid { get; set; }
}
    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);
        }
    }
private void BtConnectClick(对象发送方,事件参数e)
{
国际港口;
如果(!int.TryParse(tbPort.Text,out-port))
{
Show(“请在文本框中输入有效端口”);
tbPort.Text=“”;
返回;
}
尝试
{
_侦听器=新的TcpListener(IPAddress.Any,端口);
_listener.Start();
_BeginAcceptSocket(OnClientConnect,_listener);
}
捕获(SocketException se)
{
MessageBox.Show(se.Message);
}
}
客户端连接上的公共无效(IAsyncResult asyn)
{
尝试
{
var s=_listener.EndAcceptSocket(asyn);
_clients.Add(s);//列表对象
}
捕获(SocketException se)
{
MessageBox.Show(se.Message);
}
}
但是服务器应该如何处理数据传输呢

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

此外,客户端应该监听从服务器接收的数据,并将数据发送到服务器。我能用一个插座处理所有这些吗?还是应该用两个插座


谢谢你的帮助

就我个人而言,我会将此留给消息总线/服务总线,或任何其他与pub/sub相关的东西。我的首选是redis:


如果是对象,我会使用protobuf net,因为我知道它会为上述消息生成微小的二进制文件。向指定的redis频道发送(发布)BLOB将导致该频道上的所有侦听器都被分发。

就我个人而言,我会将此留给消息总线/服务总线,或任何其他带有pub/sub的内容。我的首选是redis:


如果是对象,我会使用protobuf net,因为我知道它会为上述消息生成微小的二进制文件。向一个命名的redis频道发送(发布)一个BLOB将导致它被分发到该频道上的所有侦听器。

我想知道。。。你必须自己做吗?有许多消息总线是预卷的。见鬼,你可以用redis来做这个非常简单的事情(酒吧/酒吧)…我不必自己做。我不完全熟悉“redis”,你能详细说明一下吗?严格来说,redis是一个(免费)缓存服务器,但它包括pub/sub。您的侦听器向某个命名频道发出订阅,而发布器向该频道发出发布:因此,您发送的任何数据块都会分发给所有侦听器。你可以很容易地找到c#绑定,或者我这里有一个完全异步的绑定,我想让Jeff让我把它作为一个小项目发布……另请参见:我刚刚同意向社区发布我的异步redis绑定;今天晚些时候我会尝试添加它们我想知道。。。你必须自己做吗?有许多消息总线是预卷的。见鬼,你可以用redis来做这个非常简单的事情(酒吧/酒吧)…我不必自己做。我不完全熟悉“redis”,你能详细说明一下吗?严格来说,redis是一个(免费)缓存服务器,但它包括pub/sub。您的侦听器向某个命名频道发出订阅,而发布器向该频道发出发布:因此,您发送的任何数据块都会分发给所有侦听器。你可以很容易地找到c#绑定,或者我这里有一个完全异步的绑定,我想让Jeff让我把它作为一个小项目发布……另请参见:我刚刚同意向社区发布我的异步redis绑定;今天晚些时候我会尝试添加它们好的,这绝对是一种简单的方法。谢谢好的,这绝对是做事情的简单方法。谢谢