Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2009, 18:18   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию TCPClient, TCPServer : SendBufer()

Вроде всё отсылает, ничего не теряется. Но получается не то, что хотелось бы, получается кусок не пойми какой картинки. Также мне кажется что у меня что-то зависает после 1ой отправки, потому что потом на имеидже ничего не отображается.
Код:
unit CardSendTCP_Delphi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Sockets, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    TcpClient1: TTcpClient;
    TcpServer1: TTcpServer;
    Edit2: TEdit;
    Button2: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
    procedure Edit2Click(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Bmp : Tbitmap;
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
p : tpoint;
DC : HDC;
buff : array [1..9900] of integer;
i,j,t : integer;
begin
label1.Caption := 'Послано:';
label3.Caption := 'Размер буфера:';
label2.Caption := 'Принято:';

TCPClient1.RemoteHost := Edit2.Text;

if TCPClient1.Connect then
begin
  GetCursorPos(p);
  DC := GetDC( 0 );
  bitblt(Bmp.Canvas.Handle,0,0,110,90,DC,p.X-55,p.Y-45,SRCCOPY);
  ReleaseDC( 0,DC );
  for j := 1 to 90 do begin
    for i := 1 to 110 do buff[i+j-1] := bmp.Canvas.Pixels[i,j];
  end;
  label3.Caption :='Размер буфера: '+inttostr(SizeOf(Buff));
  t := TCPClient1.sendbuf(buff,SizeOf(Buff));
  label1.Caption := 'Послано: '+inttostr(t);
  TCPClient1.Disconnect;
end
else
  Edit2.Text := 'Сервер не отвечает'
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
if Edit2.Text = 'IP получателя' then Edit2.Text := '';
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if ((key<'0')or(key>'9'))and(key<>'.')and(key<>#8) then key := #0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.Width := 110;
Bmp.Height := 90;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
buff : array [1..9900] of integer;
i,j,t : integer;
begin
t := ClientSocket.ReceiveBuf(buff,SizeOf(Buff));
Label2.Caption := 'Принято: '+inttostr(t);
for j := 1 to 90 do begin
  for i := 1 to 110 do begin
    Image1.Canvas.Pixels[i,j] := buff[i+j-1];
  end;
end;
end;

end.
Zeraim вне форума Ответить с цитированием
Старый 27.12.2009, 20:00   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а может лучше через поток отсылать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2009, 20:06   #3
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Через поток, я так и не понял как считывать то что прислали.
То есть если допустим отправлять:
Bmp.SaveToStream(strm);
TCPClient1.SendStream(strm);
То потом я без понятия как это читать.
Есть еще варианты где сохранялась информация в виде текстового файла, и потом опять же потоком отсылалась. Читалась в итоге построчно. Но вроде он ничем не лучше чем отсылать просто массивом.
Zeraim вне форума Ответить с цитированием
Старый 27.12.2009, 20:30   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
  var DataLen: Integer);
var M:TMemoryStream;
begin
 M:=TMemoryStream.Create;
 M.WriteBuffer(Buf[0]{вроде 0 в PChar это первый символ},DataLen);
 Image1.Picture.Bitmap.LoadFromStream(M);
 M.Free;
end;
правда у нас похоже версии разные...но намек я дал
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2009, 21:22   #5
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Хм чтения потоком я так и не нашёл, только через буфер, но я всё равно попробовал, в итоге:
Код:
strm := TMemoryStream.Create;
bmp.SaveToStream(strm);
t := TCPClient1.SendStream(strm);
strm.Free;
если SendStream возвращает число посланных байт, то отсылается 0, и выдаёт ошибку неправильного дискриптора(№6)
Код:
strm := TMemoryStream.Create;
//t := ClientSocket.ReceiveBuf(strm,SizeOf(strm));
t := ClientSocket.PeekBuf(strm,sizeOf(strm));
bmp.LoadFromStream(strm);
image1.Canvas.Draw(0,0,bmp);
strm.Free;
Пробовал оба 2 варианта считывать что прислали, везде естественно принято 0 байт, и ошибок тоже нету, хотя если бы удалось что-то отослать думаю ошибку получили бы. Юзаю халявный билдер, 2006 вроде. 8)
Zeraim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] TCPserver, TCPclient MASSIOMO Работа с сетью в Delphi 14 29.07.2010 17:53
Помогите разобраться с TcpServer и TcpClient KingMaker Компоненты Delphi 0 30.03.2009 08:59
Serversocket,clientsocket и TCPserver, TcpClient prizrak1390 Компоненты Delphi 2 04.02.2008 08:10
TcpClient и TcpServer DOLBY Работа с сетью в Delphi 5 17.12.2007 10:43
TCPServer и TCPClient Antoha Работа с сетью в Delphi 19 06.10.2007 12:01