大侠,请教了:我曾经看到你说socket最好不要用ReceiveLength
最好用ReceiveBuf 但是里面的integer参数传什么好呢?
下面一段代码我收到的是一个传输错误的图象,请问问题出在什么地方?
如果用ReceiveLength的方法我在本机上接收无误,在其他机子上也无法正确接收,怎么回事阿?
多谢了!!!!急用!!!
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //设置接收缓冲区
len,size:integer;
ll:string;
b:Tbitmap;
j:Tjpegimage;begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //设置需接收的字节数
LeftSIze:=strtoint(ll);
clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
end
else
begin //以下为图象数据接收部分
// len:=socket.ReceiveLength; //读出包长度
if LeftSize>8192 then recvsize:=8192
else recvsize:=LeftSize;
socket.ReceiveBuf(buffer,recvsize); //接收数据包并读入缓冲区内
m.Write(buffer,recvsize); //追加入流M中
LeftSize:=LeftSize-recvsize;
size:=m.Size;
if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=Tbitmap.Create;
j:=Tjpegimage.Create;
try
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
j.SaveToFile('C:\receive.jpeg');
Image1.Picture.Bitmap.Assign(j); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;end;
最好用ReceiveBuf 但是里面的integer参数传什么好呢?
下面一段代码我收到的是一个传输错误的图象,请问问题出在什么地方?
如果用ReceiveLength的方法我在本机上接收无误,在其他机子上也无法正确接收,怎么回事阿?
多谢了!!!!急用!!!
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //设置接收缓冲区
len,size:integer;
ll:string;
b:Tbitmap;
j:Tjpegimage;begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //设置需接收的字节数
LeftSIze:=strtoint(ll);
clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
end
else
begin //以下为图象数据接收部分
// len:=socket.ReceiveLength; //读出包长度
if LeftSize>8192 then recvsize:=8192
else recvsize:=LeftSize;
socket.ReceiveBuf(buffer,recvsize); //接收数据包并读入缓冲区内
m.Write(buffer,recvsize); //追加入流M中
LeftSize:=LeftSize-recvsize;
size:=m.Size;
if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=Tbitmap.Create;
j:=Tjpegimage.Create;
try
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
j.SaveToFile('C:\receive.jpeg');
Image1.Picture.Bitmap.Assign(j); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;end;
解决方案 »
- 求个简单算法
- 可否让鼠标的滚轮和功能键也可以在delphi中正常使用
- 如何自定义FONT对话框中的内容
- Rave Reports5.0界面问题,很急!
- 有学生管理系统吗
- 在多层(MIDAS)里,怎样实现Master/Detail关系的操作?加分为谢。
- 关于SQL SERVER生的成的脚本?
- 一个说难不难,说简单不简单的问题。不过我不会就觉得很难(一定给分)
- 哪位大哥可以把Delphi6目录里的DCC60.DLL发给我,我的坏了,又找不到盘,急。[email protected]
- 请指教在dll中调用ChartFx控件并将统计图保存为bmp或gif的方法
- 有关窗口停靠(所谓"Dock技术")的一些问题,有经验的清进--------〉〉〉〉〉〉〉〉〉
- 求助:显示两个表的合计数据并求差值, 这样的SQL怎么写?
Socket: TCustomWinSocket);
var
s,s1:string;
desk:tcanvas;
bitmap:Tbitmap;
jpg:Tjpegimage;
myrect1,myrect2,Destrect1,Destrect2:Trect;
i,SendSize:integer;
Buf:array[0..BufSize-1] of char;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
bitmap:=Tbitmap.Create;
jpg:=Tjpegimage.Create;
desk:=Tcanvas.Create; //以下代码为取得当前屏幕图象
desk.Handle:=getdc(0);
m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)发送流后,
//它将保留到socket对话结束,
//不能用手工free掉,否则会触发异常
MyRect1:=Rect(0,0,screen.Width , Screen.Height );
DestRect1:=MyRect1;
bitmap.Width:=screen.Width ;
bitmap.Height:=Screen.Height ;
bitmap.Canvas.CopyRect(DestRect1,desk,MyRect1);
// bitmap.SaveToFile('C:\socket.bmp');
jpg.Assign(bitmap); //将图象转成JPG格式
//jpg.SaveToFile('C:\socket.jpeg');
jpg.SaveToStream(m1); //将JPG图象写入流中
// LeftSize:=m1.Size;
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok'then //客户端已准备好接收图象
begin
m1.Position:=0;
{ if LeftSize>BufSize then SendSize:=BufSize
else SendSize:=LeftSize;
m1.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then m1.Clear;}{ 清空流 }
Socket.SendStream(m1); //发送JPG图象
end;
end;
1,TCP相对比较耗时的是连接过程,(这点不涉及错误,只涉及优化)。
2,TCP是基本数据流的通讯,它自身并没有把传出的数据流作什么分隔同步机制,需要自己
实现。
3,根据2点,在异步SOCKET中,整个数据流是保持可靠的,但单个OnClientRead不一定
会是完整数据。