2010-09-13 85 views
3

我正在研究從套接字讀寫二進制數據的應用程序。所以首先我使用TcpClient創建一個套接字。但我堅持從套接字讀取數據。有沒有關於如何從套接字讀取二進制數據的代碼示例?C#從套接字讀取二進制數據

混凝土,有2件事我不明白。首先,我如何知道郵件是否「已收到」?我是否需要爲此創建某種循環?第二:讀取這些數據的最好方法是什麼,因爲我收到的數據是二進制的,而不僅僅是一個普通的字符串。

謝謝

+0

有什麼關於您遇到問題的文檔?有一個很好的例子:http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx – 2010-09-13 15:09:06

回答

5

來自Microsoft的TCPClient documentation實際上非常有用。

如何讀取來自的TcpClient

的關鍵在於微軟例如部分數據從套接字讀取的數據是這樣的:

// Get the stream 
NetworkStream stream = client.GetStream(); 
Byte[] data = new Byte[256]; 

// String to store the response ASCII representation. 
String responseData = String.Empty; 

// Read the first batch of the TcpServer response bytes. 
int bytes = stream.Read(data, 0, data.Length); 
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

他們用TCPClientGetStream方法類,並從流中讀取所有可用數據(最多256個字節)。

雖然這只是一個小小的欺騙行爲,因爲他們只是接收大量數據並假設它是一個完整正確的消息。只要你的客戶是100%可預測的,它總是可以正常工作,因爲它始終發送相同的東西,然後斷開連接。處理低於此

更好的辦法...

你怎麼知道,如果收到的消息?

你不這樣做,你只是繼續接收數據,直到沒有更多,然後檢查你收到(或檢查你的行程)。要做到這一點,你必須設計消息來包含一些告訴長度的方式(開始處的整數指示長度),或者有一些消息標記的結束(例如回車)或者具有固定長度的消息。

例如您的信息規範可能是這樣的:

DATA 招呼朋友
END

通過查找END之後回車,你就會知道你已經找到消息的結尾。同樣,DATA開始處的標記可以幫助您確定消息的起始位置並拆分消息數據。

什麼是讀取這些數據的最佳方式?

發送/接收的所有數據都是二進制數據,您需要對數據進行編碼和解碼。在這個例子中,他們使用內置的ASCII編碼類GetStringGetBytes方法將二進制數據轉換爲字符串(並且相反)。

考慮實施已知協議

我會建議(如果可能)使用建立的協議,而不是僅僅發送通過TCP純文本。幾乎所有的標準都可以使用,連接到應用程序的任何人都會發現遵循已知和定義的標準更容易。

也有許多預建庫用於常用協議,爲您和您的客戶省下了ha saving。

0

通過套接字發送的所有數據都是二進制的。你可以把它解釋爲別的東西,比如一個字符串。您可以使用這些功能發送或接收數據。你可以用你從NetworkStream stream = client.GetStream();得到的NetworkStream調用它們。請注意,這些函數首先發送一個int大小的數據。

public void send(NetworkStream stream, byte[] buf) { 
    stream.Write(BitConverter.GetBytes(buf.Length), 0, 4); 
    stream.Write(buf, 0, buf.Length); 
} 

public byte[] receive(NetworkStream stream) { 
    byte[] lengthBytes = new byte[4]; 
    int read = stream.Read(lengthBytes, 0, 4); 
    // read contains the number of read bytes, so we can check it if we want 
    int length = BitConverter.GetInt32(lengthBytes); 
    byte[] buf = new byte[length]; 
    stream.Read(buf, 0, buf.length); 
    return buf; 
} 
+0

OP是使用TcpClient,而不是直接套接字。 – 2010-09-13 15:08:41

+0

@Kirk:哎呀,我剛剛注意到了。我根據標題和標籤回答了我的答案。 – Patrick 2010-09-13 15:12:23

+0

讀取tcp流比較複雜得多,因爲stream.Read()可能並不總是讀取預期的字節數。 – 2017-11-13 02:39:10

1

在這種情況下,我會推遲到MSDN。具體來說,使用TcpClients(保持一個連接 - 您正在執行的操作),TcpListeners(接受連接並開始通信)以及serialization(將數據轉換爲二進制/從二進制轉換)。

0

第一步是在TcpClient實例上調用GetStream,該實例爲您提供了用於發送和接收二進制數據的NetworkStream的引用。您可以將其封裝在BinaryReader和BinaryWriter中,以發送和接收.NET基元(如Int32s,Strings等等)或直接使用NetworkStream方法來處理字節數組。你會發現NetworkStream.Read,NetworkStream.BeginRead和NetworkStream.DataAvailable成員很有用;有關更多信息,請參閱http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream_members.aspx