2015-09-08 47 views
0

我有一些問題。 我有客戶端和服務器。客戶端通過TCP連接服務器。然後,客戶端發送一些數據(用塊分隔),我不知道數據的長度(TLS握手)是多少。但是我知道客戶端發送了一些固定長度的數據,然後停止,直到沒有收到響應,然後再發送固定長度的數據。如何從套接字讀取數據,直到客戶端停止發送?

我需要讀取所有的塊,直到客戶端停止發送(因爲有這麼多的塊)。怎麼做 ?

我只有一個想法,它超時。循環讀取數據並在迭代之間設置超時。如果超時結束,則數據完整收集。

也許有更優雅的解決方案?

+1

你能舉一個你想要做什麼的例子嗎?這個問題實際上並不合情理。 – JimB

+0

我不太瞭解你的問題,但一般來說你的身體是用'io.Reader'來表示的,你可以直接讀取它直到它結束......在分塊響應的情況下,你完全從單獨的塊,你將它看作是一個文本數據流......與一次全部服務的機構相同。希望有所幫助。 – evanmcdonnal

+0

@JimB瀏覽器(又名客戶端),連接到我的服務器和代理https網站。對於基於https的代理,瀏覽器發送CONNECT請求,偵聽200 OK響應,然後發送加密數據給我,以大塊分隔,例如 chunk1-167字節, chunk2-312字節, chunk3-72字節 然後,瀏覽器停止,等待響應,收到響應後瀏覽器再次發送塊。 我需要在一個塊中收集塊1,塊2,塊3,但我不知道瀏覽器何時停止發送塊,並切換到等待狀態。 我希望現在清楚:)? – sintanial

回答

2

根據您評論中的信息,您做錯了。編寫HTTPS代理的正確方法是讀取CONNECT行,建立上游連接,將合適的響應發送回客戶端,然後如果成功開始同時在兩個方向複製字節。你並不關心數據包或讀取大小,並且你肯定不應該在重傳之前嘗試「收集」數據包,因爲這隻會給系統增加延遲。

您可以通過每個連接啓動兩個線程,每個方向啓動一個線程,或者通過非阻塞套接字和select()/poll()/epoll()或Go中的任何其他類型來完成此操作。

但是我不知道你爲什麼這麼做。現在已經有很多開源的HTTP代理,並且在處理HTTPS時,沒有任何值可以添加到它們中。你對'商業邏輯'的主張是沒有意義的,至少是無法實現的。

相關問題