https://www.cnblogs.com/zhangzhifeng/p/6065244.html
TServerSocket和TClientSocket用非阻塞模式发送和接收比较大的数据时,可能一次会接收不完,此时需要通过循环接收。
//接收
procedure TMAINFORM.TCPServer1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
variLength,I,iStart, iRevCount: Integer;iReceived: Integer;buff: array of byte;S:STRING;
beginS:='';iStart := 0;iLength:= Socket.ReceiveLength;iRevCount := iLength; //这里加入的SetLength(buff, iLength);MEMO1.Lines.Add(INTTOSTR(ILENGTH));while iLength>0 dobeginiReceived := Socket.ReceiveBuf(buff[iStart], iLength); //这里修改了注意iStart := iStart + iReceived ; //这里加入的iLength := iLength - iStart;end;//下面你的iLength 使用 iRevCount 替换了FOR I:=0 TO iRevCount -1 DOBEGINS:=S+INTTOSTR(BUFF[I]);END;MEMO1.Lines.Add(S);buff:= nil;
end;
发送:Socket.SendBuf