我正在阻塞模式下使用TClientSocket/TServerSocket創建TCP客戶端/服務器。概念驗證服務器已經使用telnet構建並測試了基本功能(接收數據)。在客戶端,將有兩個線程用於寫入,另一個用於讀取。現在,要測試「發送(或寫入)線程」,我正在使用以下代碼。但stream.WaitForData(30000)總是超時。德爾福幫助說:「在通過套接字連接讀取或寫入信息之前調用WaitForData」。所以我想知道TWinSockStream如何知道我正在調用WaitForData進行寫作而不是閱讀?TWinSocketStream.WaitForData它是如何知道我是否打算讀取或寫入?
procedure TClientThread.Execute;
var
stream: TWinSocketStream;
buffer: string;
begin
stream := TWinSocketStream.Create(FClientSocket.Socket, 60000);
try
while (not Terminated) and (FClientSocket.Active) do
begin
try
//FSendDataEvent is a trigger used for testing purpose
if FSendDataEvent.WaitFor(1000) = wrSignaled then
begin
FSendDataEvent.ResetEvent;
if stream.WaitForData(30000) then
begin
buffer := 'Hello from client';
stream.Write(buffer, Length(buffer) + 1);
end;
end;
//Other useful code
except
on E:Exception do
begin
DebugOutput('TClientThread.Execute: ' + E.Message);
end;
end;
end;
finally
stream.free;
end;
end;
即使WaitForData()被刪除,文本也不會按原樣傳輸到服務器。但是下面的代碼直接調用時沒有問題 - 沒有WaitForData()。
FClientSocket.Socket.SendText('Hi from client');
那麼在TClientSocket中使用TWinSocketStream的正確方法是什麼?
任何幫助將不勝感激。
啊哈!我現在看到了錯誤!有趣的是,代碼基於來自_「Delphi 5開發人員指南」 - 第30章使用套接字__的片段。我會做出適當的修改並回傳結果。謝謝。 – ssh 2012-03-07 13:55:50
謝謝你的工作! – ssh 2012-03-07 19:07:00