socket问题,总是丢失一次流数据,请大家帮帮。 (100分)

  • 主题发起人 主题发起人 drummer
  • 开始时间 开始时间
D

drummer

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我学着写一个抓屏程序,数据用socket传送。为什么会出现流的长度会少
一个我自己定义的发送长度?请各位大虾帮我看看下面的代码,问题在哪里。多谢!!

发送端,serverSocket的OnClientRead事件:

procedure TForm1.ssClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
str,ss:string;
Buf:array[0..BufSize-1] of char;
begin
sb.Panels[0].text:=socket.RemoteAddress;
sb.Panels[1].text:=inttostr(socket.RemotePort);
str:=socket.ReceiveText;
if str='get' then
begin //cature screen
SnapScreen; //截屏,生成一个jpg流数据jpgstream.
LeftSize:=jpgstream.Size;
jpgstream.Position:=0;
ss:=inttostr(jpgstream.size);
Socket.SendText(inttostr(jpgstream.size)); //将要发送的流的长度
jpgstream.Position:=0;
end
else if str='ok' then //客户端准备好接收流。
begin
LeftSize:=LeftSize-BufSize;
if LeftSize>bufsize then //每次发送的长度bufsize=2048.
begin
jpgstream.readBuffer(buf,bufsize);
Socket.SendBuf(buf,bufsize);
m1.write(buf,bufsize); //m1,测试用的一个流变量
end
else if (leftsize<bufsize) and (leftsize>0) then
begin //这里不会收到'ok',服务端决定的
socket.sendbuf(buf,leftsize);
m1.write(buf,leftsize);
m1.SaveToFile('c:/ttt.jpg');//这里出错,总是比原来的流长度少一个bufSize.
jpgstream.clear;
end;
end;
end;
 
估计是太SnapScreen等函数太费时间的缘故,
可以交给线程去做,在收到'get' 'ok'等的时候触发这个线程。
可能会好些。
 
看看!!!一点看不懂!!!
 
不要用ReceiveText或SendText,自己定义一个数据包,直接传送BUFFER,
如:type Datapacket = record
command: String;
Data:array[2048] of char;
end;
然后sendbuffer(Datapacket,sizeof(Datapacket));
另一端接收receivebuffer(Datapacket,sizeof(Datapacket));
case DataPacket.command of
 
to woodstock:可能不是耗时,我试过直接拷贝一个文件流,还是出错。
to zane:您说的是个好办法,谢谢。
socket是否每次传送的数据量可能不同?好象tcp自动分包的,那么自己定义一个发送长度
有什么意义呢,看是否是这个原因,我试试先
 
每次发送的长度不应该自己设定

在每次发送的时候先取出发送的长度,
把它传过去,现设定
 
SOCKET在低层是TCP自动分包发送的!
但我试过在DELPHI如果不超过8K应该是没问题的(这里的意思是指在客户端收到的也是相对
应的数据包,即一一对应)
其实象你这种问题解决方法也就象楼上的几位说的那样!
你先可把你要发送图片的大小发过去,
在发送端一次性把图片发出去就行,你不用担心会丢,因为只要你SENDBUF,TCP就会自己去
整理怎么发它,
而客户端你就记录你每次收到的字节数,还没到图片的大小时,你可一直把收到的数据放
到一缓冲区内去,当收到字节等于图片大小时你把缓冲区读出来就行了!
 
在Delphi4--电子工业出版社(macrocantu)中有一个例子,相信可以决你的问题。
 
谢谢各位,我的问题确实是这个原因,不好意思,还是对socket的基本原理还没理解,
唉,一个人太孤陋寡闻了。但是没理头号大侠说的不超过8k会收发双方一一对应,可能不对,我单步跟踪
过clientsocket的read事件,大多数时侯是8K,但也有时少于8K(我在本机试的)。我的理解
是,每次触发read事件时,数据的长度是不定的,tcp在建立连接时,双方会根据情况
协商一个每次传输的最大值,在具体收发过程中,会根据网络等状态而调整。不知对不对?
请大侠们不要发笑啊,指点指点一下,多谢!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
686
import
I
I
回复
0
查看
552
import
I
I
回复
0
查看
1K
import
I
后退
顶部