serverSocket 接收消息 当接收到很长数据的时候,它会分段接收 有没有地方设,让它收一次就收完了啊
解决方案 »
- 有没有用DXDBGrid控件的啊
- 求救:类定义后,在其他窗体使用时出错,是怎么回事?谢谢
- !!!非常急,先谢了,一个多控件和一个数组的问题!!!
- 用InstallShield打包sql server数据库的问题,解决就给分!
- 一个很简单的问题!望大侠们不吝赐教!谢谢!!!找到答案马上给分
- 哪位大哥能告诉兄弟一个DELPHI7企业版的序列号啊?
- 关于执行中的子线程又被主线程多次调用其Execute方法的问题
- 关于FIREMONKEY开发IPAD程序的问题
- 请教关于打印的问题,帮忙有分
- 用ADO控件经常弹出一个Database Login对话框,有什么方法可以把这个对话框去掉?
- DELPHI中怎么获取数据库操作错误?
- 多字段查询的问题
TData = record
Received: Integer; //实际接收的长度
Length: Integer; //报文长度标识
Data: AnsiString; //除长度标识外的业务数据
end;
PData = ^TData;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data: PData;
iLen, iRecved: Integer;
begin
if Socket.Data = Nil then begin
New(Data);
Socket.Data := Data;
Data.Received := 0;
Data.Length := 0;
end else begin
Data := Socket.Data;
end;
iLen := Socket.ReceiveLength; while Data.Received < 4 do begin
iRecved := Socket.ReceiveBuf(Data.Length, Min(iLen,4- Data.Received) );
if iRecved <=0 then Exit; Data.Received := iRecved + Data.Received;
if Data.Received = 4 then begin
Data.Length := ntohl( DATA.Length); //传输时使用的是网络字节序,所以要转换为主机字节序
SetLength(Data.Data,DATA.Length);
end; Dec(iLen, iRecved);
if iLen <=0 then Exit;
end; while (iLen > 0) and (Data.Received < Data.Length + sizeof(Data.Length)) do begin
iRecved := Socket.ReceiveBuf(Data.Data[Data.Received - 4 + 1], Min(iLen,Data.Length + 4 - Data.Received) );
if iRecved <=0 then Exit; Data.Received := iRecved + Data.Received;
if Data.Received = Data.Length + sizeof(Data.Length) then begin
Data.Received := 0;
ShowMessage(Data.Data);
end; Dec(iLen, iRecved);
if iLen <=0 then Exit;
end;end;