2012-03-07 35 views
3

我正在阻塞模式下使用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的正確方法是什麼?

任何幫助將不勝感激。

回答

4

該文檔是錯誤的。 WaitForData()只適用於閱讀,不適用於書寫。

至於用TWinSocketStream寫入數據,您在第一個參數Write()中傳遞了錯誤的值,這就是爲什麼它沒有正確發送。第一個參數是一個無類型const,所以你需要尊重字符串爲了通過的第一個字符的內存地址,例如:

Stream.Write(Buffer[1], ...); 

或者:

Stream.Write(PChar(Buffer)^, ...); 
+0

啊哈!我現在看到了錯誤!有趣的是,代碼基於來自_「Delphi 5開發人員指南」 - 第30章使用套接字__的片段。我會做出適當的修改並回傳結果。謝謝。 – ssh 2012-03-07 13:55:50

+0

謝謝你的工作! – ssh 2012-03-07 19:07:00

相關問題