2015-06-25 4 views
0

Я использую Delphi XE8 для разработки мобильных приложений и настольных приложений. В мобильном приложении я использую компонент TIDtcpClient и приложение Desktop для рабочего стола, я использую TServerSocket.Необходимо отправить данные из TServersocket в TidTcpClient

Приложение сервера Desktop содержит TList, который содержит около 1500 записей. Для получения этих значений в приложении Client Mobile я использую следующий метод.

  1. Сначала запрос на загрузку отправляется с мобильного приложения «Клиент» на приложение «Сервер».
  2. Затем он извлекает 10 записей и отправляет их обратно в мобильное приложение клиента. После этого он обновляет значения в списке клиентов, а затем снова отправляет запрос на серверное приложение.
  3. До достижения количества записей этот процесс продолжается.

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

Server Side приложение:

//first saved the List into FileStream & it is working as I have reloaded and checked 
//So again I'm loading the saved file, The file Size is near to 400KB 
FileStream := TFileStream.Create('D:\ListDet.dat', mtfmOpenRead); 
Socket.SendStream(FileStream); 

стороне клиента мобильное приложение:

var 
    FileS: TFileStread; 
    i: Size; 
begin 
//Inside the thread 
    TiDTcpClient.IOHandler.ReadStream(FileS, i); 
end; 

И когда я использую выше метод, я получаю исключение, и я не могу получить данные.

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

+1

Компонент TServerSocket уже давно устарел и устарел. Я рекомендую использовать Indy для серверной части. – mjn

+0

'Я получаю исключение' ... каков фактический класс исключения и сообщение? – mjn

+0

Я получаю закрытое изящное исключение в приложении-клиенте (мобильное устройство). – test12345

ответ

0

Проблема в том, что, следуя этому методу, требуется почти 2 минуты времени, и я получаю все данные правильно.

Вы не указали/не объяснили, какие фактические методы ввода-вывода вы использовали для отправки данных в этой ситуации.

Поэтому я решил использовать метод потока файлов ... И когда я использую вышеуказанный метод, я получаю [Закрытое изящное исключение в приложении-клиенте (Мобильный)], и я не могу извлечения данных

TCustomWinSocket.SendStream() просто посылает содержимое TStream как есть, это не что-нибудь еще отправить.

Вы передаёте неинициализированную переменную, i, на TIdIOHandler.ReadStream(). Этот параметр сообщает ReadStream(), сколько байтов для чтения. Поскольку i неинициализирован, его значение представляет собой случайные данные, находящиеся в стеке в этот момент.

Если i является > 0 во время выполнения, то есть сколько байтов ReadStream() попытается прочитать. Если такое количество байтов фактически не отправлено, ReadStream() блокирует вызывающий поток, ожидающий большего количества байтов, до тех пор, пока не истечет его ReadTimeout (что по умолчанию бесконечно) или сокет отключен.

Если i случается именно -1 (а параметр AReadUntilDisconnect является значение False по умолчанию), ReadStream() попытается прочитать Integer/Int64 (в зависимости от TIdIOHandler.LargeStream собственности) из розетки и использовать его в качестве счетчика байт, чтобы закончить читая остальную часть потока. TCustomWinSocket.SendStream() не отправляет такое значение размера.

Если i случается < 0, ReadStream() будет просто игнорировать количество байтов и просто продолжайте чтение, пока сокет не будет отключен (AReadUntilDisconnect вынужден True).

По умолчанию TIdIOHandler.ReadStream() следует ожидать, чтобы данным потока предшествовал размер потока, но вы переопределяете это поведение, передавая неинициализированную переменную i, поэтому поведение не определено.

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