C # Асинхронная передача объекта (сокеты?) - PullRequest
1 голос
/ 29 марта 2011

Я пытаюсь выяснить, как лучше всего подходить к передаче асинхронных объектов.

Я хочу открыть несколько экземпляров одного и того же приложения через сетевое подключение (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, и как только я получу данные, мне нужно перенаправить их на все остальные, поэтомуckets в _clinets, но как мне это сделать?Как и где я должен определить, когда клиент разорвал соединение?

Кроме того, клиенты должны прослушивать данные, которые будут получены с сервера, а также отправлять данные на сервер.Могу ли я справиться со всем этим с помощью одного разъема или использовать 2?

Спасибо за любую помощь!

1 Ответ

1 голос
/ 29 марта 2011

Лично я бы оставил это сообщению bus / service-bus или чему-либо еще с pub / sub. Я бы предпочел Redis: http://redis.io/commands#pubsub

Что касается объекта, я бы использовал protobuf-net просто потому, что я знаю, что он создаст крошечный двоичный файл для вышеприведенного сообщения. Отправка (PUBLISH) BLOB на указанный канал Redis приведет к его распространению среди всех слушателей на этом канале.

...