2015-02-07 58 views
1

創建將使用IdTCPClient1讀取接收數據的線程的正確方法是什麼?並且所有數據都以TStream或Tmemorystream格式。使用Indy讀取線程中的TStream數據

我想:

constructor TReadResponse.Create(AConn: TIdTCPConnection); 
begin 
    FConn := AConn; 
    inherited Create(False); 
end; 

procedure TReadResponse.Execute; 
var 
    RcvStrMem : TMemoryStream; 
begin 
    while not Terminated and FConn.Connected do 
    begin 
    try 
     RcvStrMem := TMemoryStream.Create; 
     FConn.IOHandler.LargeStream := True; 
     FConn.IOHandler.ReadStream(RcvStrMem, -1, False);//error here ?? 
     //MessageBox(0, pChar(inttostr(RcvStrMem.Size)), 0, 0); 
     TWriteResponse.AddResponse(RcvStrMem); 

    finally 
     RcvStrMem.Free; 
    end; 
    end; 
end; 

WriteResponse線程

class procedure TWriteResponse.AddResponse (AResponse: TStream); 
begin 
    with Create(AResponse) do try 
    Synchronize; 

    finally 
    Free; 
    end; 
end; 

procedure TWriteResponse.DoSynchronize; 
begin 
//do something 
end; 

下面是如何執行在Form1上線:

var 
    rr: TReadResponse = nil; 
...... 
procedure TForm1.IdTCPClient1Connected(Sender: TObject); 
begin 
rr:= TReadResponse.Create(IdTCPClient1); 
end; 
+0

@iPathツ:此代碼是**客戶端**。 'TIdTCPClient'不是線程組件,所以需要手動線程。您正在考慮'TIdTCPServer'。 – 2015-02-07 18:47:50

+0

@RemyLebeau我誤解了這個問題。感謝提示。我的評論被刪除。 – 2015-02-07 22:50:41

回答

2

您顯示的代碼行,前提是每一個TCP消息是前面是一個Int64,按網絡字節順序,指定的大小爲t他留言,因爲這正是通過設置LargeStream=True,AByteCount=-1AReadUntilDisconnect=False來告訴ReadStream()要讀取的內容。它將讀取8個字節並將它們解釋爲Int64,然後讀取Int64說的很多字節。

由於您沒有提供有關您的實際TCP協議的任何詳細信息,因此沒有人可以告訴您是否正確讀取TCP消息。你說在ReadStream()上有錯誤,但你沒有說錯誤是什麼。但是,您收到錯誤的事實表明TCP消息不是ReadStream()預期的格式。

如果您需要更多幫助,則需要顯示TCP消息的實際外觀。

相關問題