我在Delphi中使用Indy10,并试图与网络上的一个TCP服务器建立一个简单的TCP连接。服务器发送一条简单的Hello消息,然后断开连接,等待另一个连接。我有以下代码,用于连接,并尝试从服务器读取消息。
with Client do
begin
Host := '10.10.81.122';
Port := 3490;
Connect;
if IOHandler.Connected then
writeln('Connected!');
if IOHandler.InputBufferIsEmpty then
begin
if IOHandler.CheckForDataOnSource(1000) then
begin
writeln('Buffer size:' + IntToStr(IOHandler.RecvBufferSize));
IOhandler.ReadBytes(buffer, IOHandler.RecvBufferSize);
end
else
writeln('Message not received');
end;
end;当我运行这段代码时,我得到了recvBufferSize的一个值,但是缓冲区仍然是空的,然后我得到一个连接终止的消息。
发布于 2014-04-24 19:33:41
RecvBufferSize与实际可用的数据数量无关。RecvBufferSize仅指定Indy在分配内部缓冲区从套接字读取原始数据时使用的大小。不管实际读取的是什么原始数据,都会放在IOHandler.InputBuffer中供ReadBytes()和其他IOHandler读取方法使用。
请使用以下代码:
with Client do
begin
Host := '10.10.81.122';
Port := 3490;
try
Connect;
WriteLn('Connected!');
if IOHandler.CheckForDataOnSource(1000) then
begin
WriteLn(Bytes available:' + IntToStr(IOHandler.InputBuffer.Size));
IOHandler.ReadBytes(buffer, IOHandler.InputBuffer.Size);
end else
WriteLn('Message not received');
except
on E: Exception do
WriteLn('Error! ' + E.Message);
end;
end;另一种选择是:
with Client do
begin
Host := '10.10.81.122';
Port := 3490;
ReadTimeout := 1000;
try
Connect;
WriteLn('Connected!');
IOHandler.ReadBytes(buffer, -1);
if Length(buffer) > 0 then
WriteLn('Bytes read:' + IntToStr(Length(buffer)))
else
WriteLn('Message not received');
except
on E: Exception do
WriteLn('Error! ' + E.Message);
end;
end;尽管如此,这并不能保证您实际上将收到完整的消息,因为这段代码只是读取读取时可用的任何原始数据。由于您的服务器在数据末尾发送一个中断行,所以可以使用ReadLn()而不是ReadBytes(),并让Indy等待直到实际收到中断:
with Client do
begin
Host := '10.10.81.122';
Port := 3490;
ReadTimeout := 1000;
try
Connect;
WriteLn('Connected!');
Msg := IOHandler.ReadLn;
if not IOHandler.ReadLnTimedOut then
WriteLn('Message read:' + Msg)
else
WriteLn('Message not received');
except
on E: Exception do
WriteLn('Error! ' + E.Message);
end;
end;另一种选择是:
with Client do
begin
Host := '10.10.81.122';
Port := 3490;
try
Connect;
WriteLn('Connected!');
Msg := IOHandler.ReadLn(LF, 1000);
if not IOHandler.ReadLnTimedOut then
WriteLn('Message read:' + Msg)
else
WriteLn('Message not received');
except
on E: Exception do
WriteLn('Error! ' + E.Message);
end;
end;https://stackoverflow.com/questions/23268783
复制相似问题