Как отправить объект через сокет C # - PullRequest
1 голос
/ 04 ноября 2011

У меня есть список объектов, и я хочу отправить его с мыслью о соединении через сокет TCP. Одним из способов является получение списка объектов и получение всех значений, разделяющих их запятыми и получающими данными, а с другой стороны и значения в объекте. Могу ли я отправить список объектов, как это можно сделать в веб-сервисе WCF. Это так, вы можете показать мне, как? Спасибо!

Я уже создал службу WCF для этого, но изменил ее, поскольку в ней есть несколько проблем, которые не могут быть решены. Итак, я создаю это приложение клиент-сервер.

Кроме того, отправляемые данные обновляются каждые несколько секунд, и это потребуется многим пользователям. После некоторых исследований я обнаружил, что это был бы лучший вариант.

У меня есть этот класс, с которым я отправлял свои сообщения через

public void SendMessage(string text)
{
    Byte[] bytesSent = Encoding.UTF8.GetBytes(text);
    SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
    writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
    socket.SendAsync(writeEventArgs);
}

Но я бы предпочел сначала сериализовать объект, а затем отправить его. Итак, у меня есть поток и мне нужно в качестве байтового массива.

Это то, что я должен получить данные:

void ReceiveData()
{
    try
    {
        int recv;
        string stringData;
        while (true)
        {
            recv = socket.Receive(data);
            stringData = Encoding.ASCII.GetString(data, 0, recv);
            if (stringData == "bye")
                break;
            ClientDataRecievedEventArgs sd = new ClientDataRecievedEventArgs(stringData);
            DataRecieved(this, sd);
        }
        stringData = "bye";
        byte[] message = Encoding.ASCII.GetBytes(stringData);
        socket.Send(message);
        socket.Close();
        this.Dispose();
        return;
    }
    catch (Exception)
    {
        socket.Close();
        this.Dispose();
    }

}

Я хочу использовать это:

SoapFormatter formatter = new SoapFormatter();

foreach (Communication.Client Client in server.ClientList)
{
    foreach (ObjectLibrary.Model.PIP p in Repository.GlobalRepository.PIPInformation)
    {

        formatter.Serialize(stream, p);
        Client.SendMessage(stream);
    }
}

Как инициализировать поток? Мне нужно получить данные как Stream, чтобы десериализовать их в Object.

Итак, у меня есть список объектов. Могу ли я сериализовать целый список?

Ответы [ 3 ]

7 голосов
/ 04 ноября 2011

Вы должны «сериализовать» объекты и десериализовать их на другой стороне.См. http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx для получения информации об этом.

Вы должны быть осторожны, хотя, если что-то случится с соединением во время отправки данных, у вас может не хватить данных для полного воссоздания объектови ваша программа может потерпеть неудачу в каком-то неожиданном месте.Создавайте объекты, только если вы все получили.

2 голосов
/ 04 ноября 2011

У вас есть много объектов для сериализации, таких как двоичные файлы, XML, JSON, но есть и подход удаленного взаимодействия, не говоря уже о том, что вы можете создать веб-сервис.В двух последних случаях «посылка» и объект тривиальны, и это равносильно помещению их в сигнатуру метода в качестве параметра.

1 голос
/ 04 ноября 2011

Почему вы хотите отправлять данные через сокеты самостоятельно, а протоколы для этого (выше, чем TCP) уже доказали свою ценность?

Вам нужно будет создать протокол для отправки и получения данных и реализовать этот протокол, где вы будете тратить много времени на то, что было сделано ранее и существует уже много лет. Не говоря уже о времени, потраченном на отладку чего-то скучного, что можно использовать для более крутой части программирования, использования языка и инфраструктуры для работы с «скучной» частью, и связать это вместе, чтобы решить возникшую проблему.

Вы должны позаботиться о том, чтобы, например, использовать разделители для различных объектов данных и разорванных соединений (своего рода заголовок Content-Length в вашем протоколе, который сообщает принимающей стороне, какой объем данных он должен ожидать).

Почему бы вам просто не использовать WCF в качестве оболочки для SOAP, REST или JSON (если об этом говорит другая сторона) или Net.TCP, если вы хотите реализовать клиент и сервер?

Затем вы можете просто вызвать метод обслуживания MyObject[] GetObjects(): все скучные вещи будут обрабатываться платформой, и вы получите свой массив MyObject как есть на стороне клиента. В фоновом режиме все для вас, начиная с заголовков HTTP и заканчивая сериализацией, обнаружением сброшенных соединений и созданием соответствующих исключений, будет сделано для вас Это экономит серьезное время и хлопоты.

Или вы можете использовать обычный HTTP, создать небольшое веб-приложение, в котором вы можете запросить данные в понравившемся вам сериализованном формате и десериализовать данные на стороне клиента после получения их через HttpClient.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...