如何用 SOKET 传送及接收数据流 ? 1、 Windows Socket error:(10022),on API 'recv'2、 Asynchronous socket error 10054 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 10022 提供了一个无效的参数。看看你的参数对了吗?10054 远程主机强迫关闭了一个现有的连接。同意yypp,流应分多次发送 谢谢yypp,麻烦你了,请发送给我吧 采用的是UDP一些,不过实现方法都是差不多的。接收方:const BufSize=2048;//当有流发送到UDP的端口时候procedure Tserver.SUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var ReqCode:array[0..29] of char;ReqCodeStr:string; jpg:TJpegImage; begin Timer1.Enabled:=False; StrpCopy(ReqCode,ReqCodeStr); SUDP.ReadStream(TmpStream); Application.ProcessMessages; RsltStream.CopyFrom(TmpStream,NumberBytes); if NumberBytes< BufSize then // 数据已读完 } begin Application.ProcessMessages; if t=1 then begin Server.SpeedButton1.Enabled:=True; Server.SpeedButton1.Visible:=True; end; jpg:=TJpegImage.Create; RsltStream.Position:=0; UnCompressBitmap(RsltStream, jpg); jpg.SaveToFile('c:\windows\qnn.jpg'); jpg.free; Application.ProcessMessages; Server.Image1.Picture.LoadFromFile('c:\windows\qnn.jpg'); TmpStream.Clear; RsltStream.Clear; Application.ProcessMessages; if t=2 then Timer1.Enabled:=True; end else begin Application.ProcessMessages; TmpStream.Clear; ReqCode:='show'; SUDP.RemoteHost:=ss; SUDP.SendBuffer(ReqCode,30); Application.ProcessMessages; end;end;//流解压过程procedure UnCompressBitmap(const CompressedStream: TMemoryStream; var jpgg: TJpegImage); var SourceStream: TDecompressionStream; DestStream: TMemoryStream; Buffer: PChar; Count: Integer;Begin//从被压缩的图像流中读出原始图像的尺寸 CompressedStream.ReadBuffer(Count, SizeOf(Count));//根据图像尺寸大小为将要读入的原始图像流分配内存块 GetMem(Buffer, Count); DestStream := TMemoryStream.Create; SourceStream := TDecompressionStream.Create(CompressedStream); Try//将被压缩的图像流解压缩,然后存入 Buffer内存块中 SourceStream.ReadBuffer(Buffer^, Count);//将原始图像流保存至 DestStream流中 DestStream.WriteBuffer(Buffer^, Count); DestStream.Position := 0;//复位流指针//从 DestStream流中载入原始图像流 jpgg.LoadFromStream(DestStream); finally FreeMem(Buffer); DestStream.Free; end;end;//发送方,UDP端口收到抓屏指令后procedure TForm1.CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer);var CtrlCode:array[0..29] of char; Buf:array[0..BufSize-1] of char; SendSize:integer; Bmp: TBitmap;begin Bmp := TBitmap.Create; CUDP.ReadBuffer(CtrlCode,NumberBytes);{抓屏指令 } if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then begin {show是抓屏指令 } if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 } begin ScreenCap(bmp); {截取屏幕 } end; if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize; BmpStream.ReadBuffer(Buf,SendSize); LeftSize:=LeftSize-SendSize; if LeftSize=0 then BmpStream.Clear;{ 清空图象流 } CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 } CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的49999口 } end;end;//抓屏过程procedure ScreenCap(var Bmp: TBitmap);var jpg:TJpegImage; Dc: HDC; MyCanvas: TCanvas; MyRect: TRect;begin Dc := GetWindowDC(0); MyCanvas := TCanvas.Create; try MyCanvas.Handle := Dc; MyRect:=Rect(0,0,Screen.Width, Screen.Height); Bmp.PixelFormat := pf4bit; Bmp.Width := MyRect.Right; Bmp.Height := MyRect.Bottom; Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); finally MyCanvas.Handle := 0; jpg:=TJpegImage.Create; jpg.Assign(bmp); jpg.CompressionQuality:=30; jpg.SaveToStream(BmpStream); CompressBitmap(BmpStream, clMax); //按照最大压缩比进行压缩 BmpStream.Position:=0; LeftSize:=BmpStream.Size; MyCanvas.Free; bmp.free; jpg.free; ReleaseDC(0, Dc); end;end;//流压缩过程procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);var SourceStream: TCompressionStream; DestStream: TMemoryStream; Count: Integer;Begin //获得图像流的原始尺寸 Count := CompressedStream.Size; DestStream := TMemoryStream.Create; SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream); Try//SourceStream是原始的图像流 CompressedStream.SaveToStream(SourceStream);//将原始图像流进行压缩,DestStream中是压缩后的图像流 SourceStream.Free; CompressedStream.Clear;//写入原始图像的大小 CompressedStream.WriteBuffer(Count, SizeOf(Count));//写入经过压缩的图像流 CompressedStream.CopyFrom(DestStream, 0); finally DestStream.Free; end;end;//这个程序写了很久了,代码写得很乱,你辛苦点看看,希望对你有帮助:) BCB的代码要么?冰河作者写的抓屏然后发送的程序!!!!要的话email来:[email protected] 顺便请问,用SOKET的 SendStream 传送出流后用什么接收流?可没有 ReceviceStream 啊。 关于用socket处理比较大的字符串的问题,急 paradox入库问? !!!!高分200,求使用普通打印机打印条型码控件(200分) 怎样取到某个指定目录下的所有文件名? 求助 请问如何用delph动态的改变网页的内容 高分,请进! 我的Ie被别人设了分级浏览 DLL安装的问题。 急!急!急!关于DLL中的MDI子窗体 Delphi高手,请您Look一下! 各位老大帮我看看这段程序
看看你的参数对了吗?
10054 远程主机强迫关闭了一个现有的连接。同意yypp,流应分多次发送
接收方:
const BufSize=2048;
//当有流发送到UDP的端口时候
procedure Tserver.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
jpg:TJpegImage;
begin
Timer1.Enabled:=False;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
Application.ProcessMessages;
RsltStream.CopyFrom(TmpStream,NumberBytes);
if NumberBytes< BufSize then // 数据已读完 }
begin
Application.ProcessMessages;
if t=1 then
begin
Server.SpeedButton1.Enabled:=True;
Server.SpeedButton1.Visible:=True;
end;
jpg:=TJpegImage.Create;
RsltStream.Position:=0;
UnCompressBitmap(RsltStream, jpg);
jpg.SaveToFile('c:\windows\qnn.jpg');
jpg.free;
Application.ProcessMessages;
Server.Image1.Picture.LoadFromFile('c:\windows\qnn.jpg');
TmpStream.Clear;
RsltStream.Clear;
Application.ProcessMessages;
if t=2 then
Timer1.Enabled:=True;
end
else
begin
Application.ProcessMessages;
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=ss;
SUDP.SendBuffer(ReqCode,30);
Application.ProcessMessages;
end;
end;//流解压过程
procedure UnCompressBitmap(const CompressedStream: TMemoryStream; var jpgg:
TJpegImage);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
Buffer: PChar;
Count: Integer;
Begin
//从被压缩的图像流中读出原始图像的尺寸
CompressedStream.ReadBuffer(Count, SizeOf(Count));
//根据图像尺寸大小为将要读入的原始图像流分配内存块
GetMem(Buffer, Count);
DestStream := TMemoryStream.Create;
SourceStream := TDecompressionStream.Create(CompressedStream);
Try
//将被压缩的图像流解压缩,然后存入 Buffer内存块中
SourceStream.ReadBuffer(Buffer^, Count);
//将原始图像流保存至 DestStream流中
DestStream.WriteBuffer(Buffer^, Count);
DestStream.Position := 0;//复位流指针
//从 DestStream流中载入原始图像流
jpgg.LoadFromStream(DestStream);
finally
FreeMem(Buffer);
DestStream.Free;
end;
end;//发送方,UDP端口收到抓屏指令后
procedure TForm1.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
SendSize:integer;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
CUDP.ReadBuffer(CtrlCode,NumberBytes);{抓屏指令 }
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
begin {show是抓屏指令 }
if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
begin
ScreenCap(bmp); {截取屏幕 }
end;
if LeftSize>BufSize then SendSize:=BufSize
else SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;{ 清空图象流 }
CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的49999口 }
end;
end;//抓屏过程
procedure ScreenCap(var Bmp: TBitmap);
var
jpg:TJpegImage;
Dc: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
begin
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
try
MyCanvas.Handle := Dc;
MyRect:=Rect(0,0,Screen.Width, Screen.Height);
Bmp.PixelFormat := pf4bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
finally
MyCanvas.Handle := 0;
jpg:=TJpegImage.Create;
jpg.Assign(bmp);
jpg.CompressionQuality:=30;
jpg.SaveToStream(BmpStream);
CompressBitmap(BmpStream, clMax); //按照最大压缩比进行压缩
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
MyCanvas.Free;
bmp.free;
jpg.free;
ReleaseDC(0, Dc);
end;end;//流压缩过程procedure CompressBitmap(var CompressedStream: TMemoryStream;const
CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
//获得图像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream);
Try
//SourceStream是原始的图像流
CompressedStream.SaveToStream(SourceStream);
//将原始图像流进行压缩,DestStream中是压缩后的图像流
SourceStream.Free;
CompressedStream.Clear;
//写入原始图像的大小
CompressedStream.WriteBuffer(Count, SizeOf(Count));
//写入经过压缩的图像流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;//这个程序写了很久了,代码写得很乱,你辛苦点看看,希望对你有帮助:)
要的话email来:[email protected]