powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача разных файлов через Socket в неблокирующем режиме
5 сообщений из 5, страница 1 из 1
Передача разных файлов через Socket в неблокирующем режиме
    #39796044
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Знаю, вопрос избит, но всё же прошу помощи.

Компонент TServerSocket/TClientSocket
Сокеты в неблокирующем режиме

Клиент отправляет:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    Buffer: array [0 .. 4095] of byte;
    LenBuf: int64;

      FileStream:=TFileStream.Create(OriginalName, fmOpenRead);
      FileStream.Position:=0;
      while FileStream.Position< FileStream.Size do
      begin
        LenBuf:=FileStream.Read(Buffer,SizeOf(Buffer));
        Client.Socket.SendBuf(Buffer,LenBuf);
        Application.ProcessMessages;
      end;
      FileStream.Free;



Сервер принимает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      Buffer: Pointer;

      len:= Socket.ReceiveLength;
      GetMem(Buffer, len);
      datalen:=Socket.ReceiveBuf(Buffer^,len);          //datalen- сколько локально пришло
      FileStream.Write(Buffer^,datalen);
      DataSize:=DataSize+datalen;                           //DataSize - сколько уже записано глобально
      FreeMem(Buffer);
      if DataSize=Size then                                       // Size - заранее известное глобальное "сколько всего надо"
      begin
        FileStream.Free;
        Socket.Close;
      end;



В итоге небольшие (~до 3 Мб) файлы принимаются нормально, далее начинаются проблемы.

Я пробовал даже просто прочитать пришедшую длину ReceiveLength и считать буфер в никуда. Это для того чтобы просто просуммировать все ReceiveLength при срабатывании события прихода данных. В итоге сумма всех ReceiveLength меньше чем длина ожидаемого файла.

В какую сторону подумать?
...
Рейтинг: 0 / 0
Передача разных файлов через Socket в неблокирующем режиме
    #39796050
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
юзай SendStream передавая в него TFileStream а принимаешь через ReceiveBuf. Логично же
...
Рейтинг: 0 / 0
Передача разных файлов через Socket в неблокирующем режиме
    #39796052
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Передача разных файлов через Socket в неблокирующем режиме
    #39796056
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот в лоб.. 200 Мб передает без проблем...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure TForm3.Button1Click(Sender: TObject);
begin
  ClientSocket1.Socket.SendStream(TFileStream.Create('e:\200mb.zip', fmOpenRead));
end;

procedure TForm3.FormCreate(Sender: TObject);
begin           ReportMemoryLeaksOnShutdown := True;
  ServerSocket1.Open;
  ClientSocket1.Open;
end;

procedure TForm3.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  var fs := TFile.Open('e:\200mb_NEW.zip', TFileMode.fmOpenOrCreate);
  fs.Seek(0, TSeekOrigin.soEnd);
  var sz := Socket.ReceiveLength;
  var Buf: TBytes;
  SetLength(Buf, sz);
  sz := Socket.ReceiveBuf(Buf[0], sz);
  fs.WriteData(Buf, sz);
  fs.Free;
end;
...
Рейтинг: 0 / 0
Передача разных файлов через Socket в неблокирующем режиме
    #39796226
OxY63rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое всем откликнувшимся.
Приём файла, как оказалось, шёл нормально. Намудрил с буферной передачей. С помощью SendStream всё заработало. Но всё-таки хочу запилить прогрессбар, поэтому буду разбираться.

А пока факультативный вопрос на соображение, кому интересно:
у меня есть свой TObject, содержащий все необходимые для передачи файла проперти. Также в нём же содержится TClientSocket и TFileStream. В конструкторе моего объекта это всё создаётся динамически. Механизм такой. Вызываем
MyObject.OriginalName:='testfile.tmp';
MyObject.Send

По этой команде ClientSocket цепляется к заранее известному хосту и в событии OnConnect отправляет всю необходимую инфу приёмнику. Приёмник отвечает одобрением текстовой строкой. В событии OnRead я ловлю эту строку, перевожу флаг моего объекта в режим Receiving:=True и начинаю отправлять файл. Когда приёмник принял весь файл он закрывает соединение. В событии OnDisconnect я хочу дестроить свой объект, но не получается. По отладчику вижу, что всё содержимое освобождается нормально, но потом управление возвращается в OnDisconnect, а собственно сокет я уже убил и лювлю исключение. Что посоветуете?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача разных файлов через Socket в неблокирующем режиме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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