TClientSocket
и TServerSocket
реализуют TCP / IP, который является потоком байтов, который не имеет понятия границ сообщения (в отличие от UDP, который это делает). Когда вы вызываете SendText()
, он просто выгружает содержимое String как есть в сокет. Когда вы вызываете ReceiveText()
, он возвращает то, что в данный момент находится в буфере сокета. Вот почему вы видите, что сервер получает 'Line1Line2'. Если вы хотите провести различие между двумя строками, вам необходимо отправить разделитель между ними, например, последовательность CRLF, а затем необходимо обновить код вашего сервера, чтобы найти это. Поскольку TCP / IP является байтовым потоком, между записью и чтением не существует гарантированного отношения 1: 1. Например, вы записали 5 байтов, за которыми следуют 5 байтов, но сервер получил сразу 10 байтов. Таким образом, ваш код чтения должен буферизовать все, что он получает, и тогда вы можете проверить буфер для данных, которые вы ищете, например:
Клиент:
ClientSocket1.Socket.SendText(Edit1.Text + #13#10);
ClientSocket1.Socket.SendText(Edit2.Text + #13#10);
Сервер:
procedure TForm1.ServerSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.Data := TMemoryStream.Create;
end;
procedure TForm1.ServerSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
TMemoryStream(Socket.Data).Free;
Socket.Data := nil;
end;
procedure TForm1.ServerSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
Strm: TMemoryStream;
RecvLen: Integer;
StrmSize, I: Int64;
Ptr: PByte;
B: Byte;
s: AnsiString;
begin
Strm := TMemoryStream(Socket.Data);
RecvLen := Socket.ReceiveLength;
if RecvLen <= 0 then Exit;
StrmSize := Strm.Size;
Strm.Size := StrmSize + RecvLen;
Ptr := PByte(Strm.Memory);
Inc(Ptr, Strm.Position);
RecvLen := Socket.ReceiveBuf(Ptr^, RecvLen);
if RecvLen <= 0 then
begin
Strm.Size := StrmSize;
Exit;
end;
Strm.Size := StrmSize + RecvLen;
while (Strm.Size - Strm.Position) >= 2 do
begin
Strm.ReadBuffer(B, 1);
if B <> 13 then Continue;
Strm.ReadBuffer(B, 1);
if B <> 10 then
begin
if B = 13 then
begin
Strm.Seek(-1, soCurrent);
Continue;
end;
end;
SetString(s, PAnsiChar(Strm.Memory), Strm.Position-2);
StrmSize := Strm.Size - Strm.Position;
if StrmSize then
begin
Strm.Clear;
end else
begin
Ptr := PByte(Strm.Memory);
Inc(Ptr, Strm.Position);
Move(Ptr^, Strm.Memory^, StrmSize);
Strm.Size := StrmSize;
Strm.Position := 0;
end;
Memo1.Lines.Add(S);
end;
end;