2011-03-05 84 views
3

如果運行TIdTCPServer的服務器和使用Web瀏覽器(或任何其他軟件)進行通信的客戶端,我不知道該協議,但即時嘗試執行的操作是發送數據在客戶端和另一個連接(均連接到相同的TIdTCPServer)之間,例如第一客戶端發送的數據被髮送到第二客戶端,並且第二客戶端發送的數據被髮送到第一客戶端,如代理(i因爲它只是這一個條件,所以不能真正使用代理服務器),TIdTCPServer仍應該接收其他客戶端並處理其數據。在Indy(TIdContext)中的2個連接之間直接傳輸數據

我偶然發現了第一行代碼,因爲TIdContext.Connection.Socket.ReadLn需要一個分隔符,而客戶端的協議對於服務器是未知的。

有什麼想法?

謝謝。

+1

也許Indy中的TIdMappedPortTCP組件有幫助,但有一些修改 - 請參閱http://stackoverflow.com/questions/4136226/proxy-server-using-indy – mjn 2011-03-05 17:33:11

+1

當面對同樣的問題時,我使用了[ICS - 互聯網組件套件](http://www.overbyte.be/frame_index.html?redirTo=/products/ics.html)組件:與Indy不同,它們不會阻塞,因此您可以輕鬆地同時接收和發送數據。 – 2011-03-05 18:28:40

+0

我不能使用TIedMppedPortTCP,因爲它實際上是一個服務器,具有很多功能,提供信息和內容,並且只是服務器內部的一個功能,可以將客戶端轉移到另一個客戶端,因爲我在跨平臺開發:( – killercode 2011-03-06 14:46:45

回答

3

您可以查看TIdMappedPortTCPTIdHTTPProxyServer的源代碼,瞭解它們如何在兩個方向上的連接之間傳遞任意數據。這兩個組件都使用TIdSocketList.SelectReadList()來檢測何時連接有數據要讀取。 TIdMappedPortTCP然後使用TIdBuffer.ExtractToBytes()TIdIOHandler.Write(TIdBytes),而TIdHTTPProxyServer改爲使用TIdTCPStreamTIdBuffer.ExtractToStream()

+0

這是非常非常複雜的,因爲我從來沒有真正看過Indy Source之前,即使我這樣做了,我不認爲生病可以使我的新代碼跨平臺 – killercode 2011-03-08 06:29:59

+0

Indy是一個跨平臺的庫。我描述了在所有平臺上的工作。根據實際需要傳輸的數據,在多個'TIdContext'對象之間傳輸數據的方法有很多。 – 2011-03-08 08:04:12