Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент сервер на основе TCP, передача bmp через stream / 9 сообщений из 9, страница 1 из 1
13.02.2021, 10:55
    #40045038
Ildar007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Ребят всем привет написал клиент сервер на основе TCP, клиент видит сервер, передает ему stream, сервер может сохранить изображение из stream в bmp файл, но не выгружает из stream в bmp. В чем может быть ошибка?


Клиент

Код: pascal
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    IdTCPClient1: TIdTCPClient;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LStreamOutgoing, LStreamTwo: TMemoryStream;
  BmpImageOne, BmpImageTwo : TBitmap;
begin
  IdTCPClient1.Connect;
  if IdTCPClient1.Connected then
  Edit1.Text := 'Есть контакт'
  else
  begin
    Edit1.Text := 'Нет контакта';
    Exit
  end;

  //IdTCPClient1.Socket.WriteLn(Edit1.Text);
  //Edit1.Text := '';
  //Edit2.Text := IdTCPClient1.Socket.ReadLn;

  LStreamOutgoing := TMemoryStream.Create;
  //LStreamOutgoing.I

  LStreamTwo := TMemoryStream.Create;
  BmpImageOne := TBitmap.Create;
  BmpImageTwo := TBitmap.Create;
  BmpImageOne.LoadFromFile('C:\Users\Ildar\Desktop\79HqdU.bmp');
  BmpImageOne.SaveToStream(LStreamOutgoing);
  IdTCPClient1.Socket.Write(Int64(LStreamOutgoing.Size));
  //IdTCPClient1.IOHandler.Write(LStreamOutgoing, 0, True);
  IdTCPClient1.Socket.Write(LStreamOutgoing);

  BmpImageOne.Free;
  BmpImageTwo.Free;
  LStreamOutgoing.Free;
  LStreamTwo.Free;
  IdTCPClient1.Disconnect;
end;

end.




Сервер

Код: pascal
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdContext, Vcl.StdCtrls,
  IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  IncomingStream: TMemoryStream;
  BmpFile: TBitmap;
  LSize: Int64;
begin
  //Edit1.Text := AContext.Connection.Socket.ReadLn;
  //AContext.Connection.Socket.WriteLn(Edit2.Text);

  IncomingStream := TMemoryStream.Create;

  BmpFile := TBitmap.Create;
  LSize := AContext.Connection.Socket.ReadInt64;
  AContext.Connection.Socket.ReadStream(IncomingStream, LSize);
  BmpFile.LoadFromStream(IncomingStream);
  BmpFile.SaveToFile('C:\Users\Ildar\Desktop\CAD\123.bmp');

  IncomingStream.Free;
  BmpFile.Free;
end;

end.
...
Рейтинг: 0 / 0
13.02.2021, 14:04
    #40045060
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Ildar007,
возможно, readStream() возвращает реальное количество считанных данных, которое следует сравнивать с LSize?
...
Рейтинг: 0 / 0
13.02.2021, 14:21
    #40045063
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Или, возможно write(stream) не моет руки перед едой перематывает указатель на
начало потока.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.02.2021, 15:05
    #40045070
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Ildar007,
я не шарю в этих ваших компонентах, но вижу, что
клиент у тебя сперва шлёт поток в сокет, а потом его размер.
А сервер сперва читает размер, а потом поток.
Вот и всё.
...
А, нет. Всё правильно. Проверь значение указателя в потоке перед выгрузкой.
...
Рейтинг: 0 / 0
13.02.2021, 19:06
    #40045093
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Чтобы не гадать, должно быть так
Код: pascal
1.
2.
3.
  IdTCPClient1.Socket.Write(Int64(LStreamOutgoing.Size));
  LStreamOutgoing.Position := 0;
  IdTCPClient1.Socket.Write(LStreamOutgoing);


Код: pascal
1.
2.
3.
  AContext.Connection.Socket.ReadStream(IncomingStream, LSize);
  IncomingStream.Position := 0;
  BmpFile.LoadFromStream(IncomingStream);
...
Рейтинг: 0 / 0
13.02.2021, 19:24
    #40045094
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Чтобы не гадать разработчик должен уметь отлаживать свои программы и держать под контролем
ход их выполнения. Но фантастика не в этом разделе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2021, 14:12
    #40045211
Kast2K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
клиент
Код: pascal
1.
2.
BmpImageOne.SaveToStream(LStreamOutgoing);
IdTCPClient1.IOHandler.Write(LStreamOutgoing,0,True);



сервер
Код: pascal
1.
2.
AContext.Connection.IOHandler.ReadStream(IncomingStream,-1);
BmpFile.LoadFromStream(IncomingStream);
...
Рейтинг: 0 / 0
16.02.2021, 12:31
    #40045717
Ildar007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
_Vasilisk_, Спасибо, очень сильно помог
...
Рейтинг: 0 / 0
16.02.2021, 12:32
    #40045719
Ildar007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент сервер на основе TCP, передача bmp через stream
Kast2K
клиент
Код: pascal
1.
2.
BmpImageOne.SaveToStream(LStreamOutgoing);
IdTCPClient1.IOHandler.Write(LStreamOutgoing,0,True);



сервер
Код: pascal
1.
2.
AContext.Connection.IOHandler.ReadStream(IncomingStream,-1);
BmpFile.LoadFromStream(IncomingStream);



Я хотел сделать на основе socket а не IOHandler, но обязательно попробую
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент сервер на основе TCP, передача bmp через stream / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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