2016-08-24 94 views
1

我有問題,我想通過SocketConnection發送大字符串,但由於網絡有限,我無法一次接收字符串到1500字節,所以我如何通過Socket接收所有字節而不使用TCPClient,或者這是不可能的。如何通過套接字連接接收大數據流 - 無TCPClient

public string ReceiveString(Socket connection) 
    { 
     byte[] buffer = new byte[1048576]; 
     int recBytes = connection.Receive(buffer); 
     return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes); 
    } 

那是,我至今。

如果它不可能,通過套接字,我可以從套接字中獲取EndPoint以使用TCPClient作爲「最後的選項」?

+0

您必須自己實施[協議級別](https://en.wikipedia.org/wiki/OSI_model#Layer_4:_Transport_Layer)以將數據拆分爲數據包並接收(連接)它們。 – Sinatr

+0

你不行。 TCP將每條消息分解爲大約1500字節的數據報。當您應該使用異步方法時,您正在使用同步Receive()方法。您需要在發送功能中添加終止字符,以便接收功能可以繼續讀取1500個數據報,直到找到結束字符。 – jdweng

+0

TCP是否有某種類型的結束序列,我的意思是,我聽說過\ 0? – Silent3241

回答

3

TCP是一個字節流,它沒有消息的概念。網絡上的單個數據包的大小是無關緊要的,它只是網絡硬件的一個實現細節。 TCP保證您發送的內容是您收到的內容(但個別發送的大小與單個讀取的大小之間沒有1對1的關係,就像在UDP中一樣)。

該解決方案要求發件人以允許讀者知道何時停止閱讀的方式來構造字符串數據。可以是:

  1. 在發送字符串數據之前發送字符串長度。然後閱讀器可以先讀取長度,然後讀取指定數量的以下字節。

  2. a。用一個獨特的分隔符來終止字符串,該分隔符不能出現在字符串本身中。讀者可以繼續閱讀,直到遇到分隔符。

    b。分隔符可以關閉連接。閱讀器可以繼續閱讀,直到檢測到斷開連接。

您需要使用哪種解決方案取決於您正在實施的特定協議。 #1對於二進制協議來說是最好的,並且允許高效的內存管理,而#2更適合基於文本的協議或流式協議,其中最終長度並不提前知道。當#1和#2a是不可能的時候,有時協議不得不求助於#2b(HTTP和FTP都將它作爲時間使用)。

+0

或切換到一個更高級別的協議,建立在TCP之上,爲您實現消息/幀。 –

+0

@Damien_The_Unbeliever你可能會想到更多的預製庫而不是協議。如果您只是設計/採用消息傳遞協議,則仍然需要實現用於發送和閱讀消息幀的代碼。 –

+0

那麼,我正在考慮「切換到HTTP」或類似的。即一個建立在TCP之上的協議,已經有一個消息傳遞的概念。 –