![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! как можно отправить картинку по частям через УДП
клиент Код:
procedure TForm1.seti;
var
MemStream : TMemoryStream;
buf : array[1..40000] of Char;
begin
bmp:= TBitmap.Create;
Jpg:= TJpegImage.Create;
bmp.Height:=Screen.Height;
bmp.Width:=Screen.Width;
DC:=GetDC(0);
PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, WHITENESS);
bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
Jpg.Assign(Bmp);
jpg.CompressionQuality:=8;
jpg.Compress;
ReleaseDC(0, DC);
try
MemStream:= TMemoryStream.Create;
jpg.SaveToStream(MemStream);
For I:=0 to 10 do
Begin
MemStream.Position := 0;
IdUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);
{IdUDPClient1.SendBuffer(MemStream.Memory^, 64512);}
MemStream.Position:=0;
Application.ProcessMessages;
end;
finally
MemStream.Free;
jpg.Free;
Bmp.Free;
end;
end;
------------------------------------------
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var t:string; StrStream: TStringStream;
begin
if AData.Size<=8 then
begin
StrStream:=TStringStream.Create('');
StrStream.CopyFrom(AData, AData.Size);
if StrStream.DataString='otpravka' then seti;
end;
end;Код:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
txt1,s,sl:string; t1,jcnt:integer;
StrStream: TStringStream;
MemStream: TMemoryStream; jpg: TJpegImage;
begin
if AData.Size<=16 then
begin
StrStream:=TStringStream.Create('');
StrStream.CopyFrom(AData, AData.Size);
ListBox1.Items.Add(StrStream.DataString);
t1:=0;
repeat
jcnt:=ListBox1.Items.Count-1;
repeat
if (ListBox1.Items[jcnt]=ListBox1.Items[t1]) and
(jcnt<>t1)
then begin
ListBox1.Items.Delete(jcnt);
ListBox1.Items.Delete(t1);
end;
Dec(jcnt)
until jcnt<=t1;
Inc(t1)
until t1>ListBox1.Items.Count-1;
Application.ProcessMessages;
StrStream.Free;
end else
if AData.Size > 0 then
begin
jpg := TJPEGImage.Create;
MemStream:= TMemoryStream.Create;
MemStream.CopyFrom(AData, AData.Size);
MemStream.Position := 0;
jpg.LoadFromStream(MemStream);
Image1.Picture.Graphic := jpg;
MemStream.Free;
jpg.Free;
end;end;
---------------------------------
IdUDPClient1.Active:=true;
try
IdUDPClient1.Send('otpravka');
finally
IdUDPClient1.Active:=false;
end; |
|
#2
|
|||
|
|||
|
ну может знает кто как отправить пакет хотябы по 32кб
Код:
try
MemStream:= TMemoryStream.Create;
MemStream.LoadFromFile('c:\1.txt');
IdUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);
MemStream.Position:=0;
Application.ProcessMessages;
finally
MemStream.Free; |
|
#3
|
||||
|
||||
|
в цикле читаешь из TMemoryStream блоками размером BufferSize и посылаешь такими же блоками, с интервалом в х мс, чтобы следующий пакет не пришел раньше предыдущего.
|
|
#4
|
|||
|
|||
|
Код:
paket:=MemStream.Size div 8192; for i:=1 to paket do IdUDPClient1.SendBuffer(MemStream.Memory^,paket); ![]() |
|
#5
|
|||
|
|||
|
если я отправляю фалй тхт то приходит файл с текстом который заканчиваеться точками, а бмб весь черный
|
|
#6
|
||||
|
||||
|
Код:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer: array of Byte;
Len: Integer;
begin
Len:=AData.Size;
SetLength(Buffer, Len);
Memo1.Lines.Add(IntToStr(Len));
if FileStreamSize=-1 then
begin
AData.ReadBuffer(Buffer[0], Len);
FileStreamSize:=PInteger(@Buffer[0])^;
end else
begin
Len:=AData.Read(Buffer[0], Len);
AFileStream.Write(Buffer[0], Len);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream;
Buffer: array [0..$fff] of Byte;
Len: Integer;
begin
FileStream:=TFileStream.Create('image.jpg', fmOpenRead);
try
PInteger(@Buffer[0])^:=FileStream.Size;
IdUDPClient1.SendBuffer('10.162.48.4', IdUDPServer1.DefaultPort, Buffer[0], SizeOf(Integer));
repeat
Len:=FileStream.Read(Buffer[0], Length(Buffer));
IdUDPClient1.SendBuffer('10.162.48.4', IdUDPServer1.DefaultPort, Buffer[0], Len);
Application.ProcessMessages;
Sleep(5);
until Len=0;
finally
FileStream.Free;
end;
end;http://data.cod.ru/134691 мультиплексора клиентов нет! счетчика принятых байт до FileStreamSize тоже нет. |
|
#7
|
|||
|
|||
|
прога делает только один скрин и все, а дальше только файл растет и растет. делаю вставку AFileStream.Free; и пишет что фалй принят не доконца
Код:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer: array of Byte;
Len: Integer;
begin
Len:=AData.Size;
SetLength(Buffer, Len);
Memo1.Lines.Add(IntToStr(Len));
if FileStreamSize=-1 then
begin
AData.ReadBuffer(Buffer[0], Len);
FileStreamSize:=PInteger(@Buffer[0])^;
memo2.Lines.Add('111111='+inttostr(FileStreamSize));
end else
begin
Len:=AData.Read(Buffer[0], Len);
AFileStream.Write(Buffer[0], Len);
end;
if len=0 then begin
MemStream:= TMemoryStream.Create;
jpg:=TJPEGImage.Create;
try
MemStream.LoadFromStream(AFileStream);
MemStream.Position := 0;
jpg.LoadFromStream(MemStream);
Image1.Picture.Graphic := jpg;
finally
MemStream.Free;
jpg.Free;
if bsSkinEdit1.Text='0' then IdUDPClient1.Send('screens')
else IdUDPClient1.Send('endscreens');
end;end;end;но если сделать отдельной кнопкой AFileStream.Free; то скрины делаються нормально Последний раз редактировалось leonw, 12.12.2011 в 13:02. |
|
#8
|
|||
|
|||
|
Может это и не правельно, но главное что работает
Код:
finally
MemStream.Free;
jpg.Free;
AFileStream.Free;
end;
FileStreamSize:=-1;
AFileStream:=TFileStream.Create('temp.jpg', fmCreate); |
|
#9
|
||||
|
||||
|
Код:
FileStreamSize: Integer;
FileNum: Integer;
FileStream: TFileStream;
FileTotalRead: Integer;
procedure SendFile(FileName: String);
procedure Button1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject);
begin
SendFile('g:\__Data\22112011111.jpg');
SendFile('g:\__Data\23112011113.jpg');
end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer: array of Byte;
Len: Integer;
begin
Len:=AData.Size;
if Len=0 then Exit;
SetLength(Buffer, Len);
if FileStreamSize=-1 then
begin
FileStream:=TFileStream.Create('d:\Downloads\'+IntToStr(FileNum)+'.jpg', fmCreate);
Inc(FileNum);
AData.ReadBuffer(Buffer[0], Len);
FileStreamSize:=PInteger(@Buffer[0])^;
FileTotalRead:=0;
Memo1.Lines.Add('>> '+IntToStr(FileStreamSize));
end else
begin
Len:=AData.Read(Buffer[0], Len);
Inc(FileTotalRead, Len);
FileStream.Write(Buffer[0], Len);
if FileTotalRead=FileStreamSize then
begin
FileStream.Free;
FileStreamSize:=-1;
Memo1.Lines.Add('<<');
end;
end;
end;
procedure TForm1.SendFile(FileName: String);
var
FileStream: TFileStream;
Buffer: array [0..$fff] of Byte;
Len: Integer;
begin
FileStream:=TFileStream.Create(FileName, fmOpenRead);
try
PInteger(@Buffer[0])^:=FileStream.Size;
IdUDPClient1.SendBuffer('10.162.48.4', IdUDPClient1.Port, Buffer[0], SizeOf(Integer));
repeat
Len:=FileStream.Read(Buffer[0], Length(Buffer));
IdUDPClient1.SendBuffer('10.162.48.4', IdUDPClient1.Port, Buffer[0], Len);
Application.ProcessMessages;
Sleep(10);
until Len=0;
finally
FileStream.Free;
end;
end;http://zalil.ru/32271727 |
|
#10
|
|||
|
|||
|
Спасибо!
Цитата:
|
|
#11
|
|||
|
|||
|
да, только загрузка ЦП до 85%
и качество картинки ужасное. Клиент: Код:
1) это чтобы отключить файрвол в виндовс (зачем он нуже, Антивирь и так стоит), да и с картинкой проблем не будет
function StopFireWallService : Boolean;
var
SCMan : Cardinal;
Svc : Cardinal;
Stat : TServiceStatus;
begin
SCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
Svc := OpenService(SCMan, 'SharedAccess', SERVICE_STOP);
Result := ControlService(Svc, SERVICE_CONTROL_STOP, Stat);
CloseServiceHandle(Svc);
CloseServiceHandle(SCMan);
end;
2) сам скрин
procedure TForm1.screens;
var
FileStream: TFileStream;
Buffer: array [0..$fff] of Byte;
Len: Integer;
begin
{create screen}
bmp:= TBitmap.Create;
Jpg:= TJpegImage.Create;
bmp.Height:=Screen.Height;
bmp.Width:=Screen.Width;
DC:=GetDC(0);
PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, WHITENESS);
bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
Jpg.Assign(Bmp);
jpg.CompressionQuality:=12;
jpg.Compress;
ReleaseDC(0, DC);
{fin create screen}
{assign memory}
MemStream:= TMemoryStream.Create;
jpg.SaveToStream(MemStream);
try
MemStream.SaveToFile('image.jpg');
finally
MemStream.Free;
jpg.Free;
end;
{fin assign memory}
FileStream:=TFileStream.Create('image.jpg', fmOpenRead);
try
PInteger(@Buffer[0])^:=FileStream.Size;
IdUDPClient1.SendBuffer('192.168.0.2',80, Buffer[0], SizeOf(Integer));
repeat
Len:=FileStream.Read(Buffer[0], Length(Buffer));
IdUDPClient1.SendBuffer('192.168.0.2',80, Buffer[0], Len);
Application.ProcessMessages;
Sleep(5);
until Len=0;
finally
FileStream.Free;
end;
end; Код:
принял, закрыл файл (чтобы диск не переполнить) и заного отправил :D
var
Buffer: array of Byte;
Len: Integer;
begin
Len:=AData.Size;
SetLength(Buffer, Len);
Memo1.Lines.Add(IntToStr(Len));
if FileStreamSize=-1 then
begin
AData.ReadBuffer(Buffer[0], Len);
FileStreamSize:=PInteger(@Buffer[0])^;
end else
begin
Len:=AData.Read(Buffer[0], Len);
AFileStream.Write(Buffer[0], Len);
begin
if Len=0 then begin
try
MemStream:= TMemoryStream.Create;
jpg:=TJPEGImage.Create;
MemStream.LoadFromStream(AFileStream);
MemStream.Position := 0;
jpg.LoadFromStream(MemStream);
Image1.Picture.Graphic := jpg;
finally
MemStream.Free;
jpg.Free;
AFileStream.Free;
end;
FileStreamSize:=-1;
AFileStream:=TFileStream.Create('temp.jpg', fmCreate);
if bsSkinEdit1.Text='0' then IdUDPClient1.Send('screens')
else IdUDPClient1.Send('endscreens');
end;end;![]() |
|
#12
|
||||
|
||||
|
Цитата:
![]() |