powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача объекта по сети
8 сообщений из 8, страница 1 из 1
Передача объекта по сети
    #39513804
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Написано клиент-серверное приложение. Клиент отправляет серверу через определенный промежуток времени данных в виде сериализованного объекта посредством Socket.
Метод отправки данных
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  private Boolean sendData(List<Model.Model> models)
        {
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            byte[] bytes = new byte[26];
            byte[] bytesTotal;
            sender.Connect(IPAddress.Parse(CONSTANTS.NET_IP_ADDRESS_SERVER), CONSTANTS.NET_IP_PORT_SERVER);
            bytesTotal = iLib.serialize(models);
            sender.Send(bytesTotal);
            int i = sender.Receive(bytes);
            sender.Close();
            return (Encoding.UTF8.GetString(bytes) == CONSTANTS.CONFIRM_REPORT_SUCCESSFULLY) ;
        }


Ловим данные на стороне сервера так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
                    server = socket.Accept();
                    IPEndPoint remoteClient = (IPEndPoint)server.RemoteEndPoint;
                    clientRemoteAddress = remoteClient.Address;
                    iLib.writeLog(CONSTANTS.MSG_LOG_CONNECTION_ACCEPT + clientRemoteAddress);
                    byte[] dataRecived = getDataSocket(server);
                    if ((dataRecived.Length) > 0)
                    {
                        try
                        {
                            models = iLib.deSerialize(dataRecived);
                            writeData(models);
                            server.Send(Encoding.UTF8.GetBytes(CONSTANTS.CONFIRM_REPORT_SUCCESSFULLY));
                        }
                        catch (System.Runtime.Serialization.SerializationException sE)
                        {
                            iLib.writeLog( clientRemoteAddress+"-"+sE.Message);
                        }
                    }else
                    {
                        server.Send(Encoding.UTF8.GetBytes(CONSTANTS.CONFIRM_REPORT_UNSUCCESSFULLY));
                    }
                }
                catch (SocketException sE)
                {
                    iLib.writeLog(sE.Message);
                }


Иногда при получении данных ошибка:
Код: c#
1.
Binary stream '0' does not contain a valid BinaryHeader. Possible causes are invalid stream or object version change between serialization and deserialization.


т.е закономерность появления ошибки не выявлена. Может нормально произойти обмен, а иногда нет.

Подскажите пожалуйста из за чего может быть такая ошибка и как исправить ?
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39513809
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX
Код: c#
1.
getDataSocket(server);


ошибка может быть здесь (не все данные получены)
длина не контролируется (при преждевременном разрыве соединения)

что делать - переписать на WCF, например
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39513810
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запиши в файл что пришло и посмотри. Скорее всего только часть объекта пришла.
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39513831
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилTimRX
Код: c#
1.
getDataSocket(server);


ошибка может быть здесь (не все данные получены)
длина не контролируется (при преждевременном разрыве соединения)

что делать - переписать на WCF, например

это 100%,вместотого, чтобы гуманизмом на сокетах заниматься, на дворе 2017 г, а не 1997
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39517903
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилпереписать на WCF, например
Сделал интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
   [ServiceContract]
    public interface IST
    {
        [OperationContract]
        Boolean writeData(List<Model.Model> models);
        [OperationContract]
        void respond(string str);
    }


Сервер
Код: c#
1.
2.
3.
4.
 server = new ServiceHost(typeof(Controller), new Uri("localhost:9000/TestService"));
            BasicHttpBinding bHttpB = new BasicHttpBinding();
            server.AddServiceEndpoint(typeof(IServiceTransfer), bHttpB, "");
            server.Open();


Клиент
Код: c#
1.
2.
3.
4.
5.
EndpointAddress address = new EndpointAddress(new Uri(CONSTANTS.NET_IP_ADDRESS_SERVER));
            BasicHttpBinding binding = new BasicHttpBinding();
            ChannelFactory<IServiceTransfer.IST> factory = new ChannelFactory<IServiceTransfer.IST>(binding, address);
            IServiceTransfer.IST service = factory.CreateChannel();
            return service.writeData(models);



Если запускать оба проекта на локальной машине то обмен происходит иначе
Код: c#
1.
The message with Action 'http://tempuri.org/IST/writeData' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None)."
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39517937
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX,
Вопрос в чём?
Найдите в книжке hello world и сделайте его.
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39517945
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimRX,
Насколько помню, soap. Там доже думать о сериализации не надо.
Метод Отправить (объект) и метод Получить (объект)
...
Рейтинг: 0 / 0
Передача объекта по сети
    #39518084
TimRX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка крылась в эксепшене
Код: c#
1.
 This may be because of either a contract mismatch (mismatched Actions between sender and receiver)


Чего и следовало ожидать.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача объекта по сети
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]