2012-08-16 38 views
-1

我試圖通過使用TCP客戶端使登錄功能。我有兩種形式:客戶端和服務器端。C#如何使用TCPClient發送多個字節流?

當服務器端連接到數據庫時,客戶端處理用戶輸入。

的問題是讀者的結果,它總是兩個輸入組合成一個長的字符串是這樣的:

myusernamemypassword 

這裏的發送客戶端的的一部分:

byte[] byteUsername = Encoding.Unicode.GetBytes(username); 
    byte[] bytePassword = Encoding.Unicode.GetBytes(password); 

    NetworkStream stream = client.GetStream(); 

    stream.Write(username, 0, byteUsername.Length); 
    stream.Write(password, 0, bytePassword.Length); 
     //if offset != 0, the code always return ArgumentOutOfRangeException 

而且在服務器端的閱讀器

return Encoding.Unicode.GetString(buffer, 0, buffer.Length) 

經過長時間搜索,我找到了解決方案,但它只能處理兩個字符串;第三個字符串將與第二個字符串組合在一起。我需要爲其他功能發送至少4個字符串。

這裏的更新的讀者代碼:

List<string> list = new List<string>(); 
int totalRead = 0; 
do 
{ 
    int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead); 

    totalRead += read; 

    list.Add(Encoding.Unicode.GetString(buffer, 0, totalRead)); 

} while (client.GetStream().DataAvailable); 

我不太理解這個代碼。它如何知道哪些字節是第一個字符串的一部分? sizeRead()參數是length-totalRead這是length - 0,它應該返回整個緩衝區的權利?

任何解決方案的傢伙?

由於

+2

看到這個最近的問題:http://stackoverflow.com/questions/11949753/tcp-ip-message-framing/11952072#11952072 – tcarvin 2012-08-16 14:57:59

+1

「它怎麼知道哪些字節是第一個字符串的一部分?」 - **它不知道**這是你不應該使用你不明白的代碼的原因之一。我會做的是將列表轉換爲一個字節[]併發送。你也可以做的就是把這四個字符串組合起來,然後把每個字符串的長度發送到服務器,然後用這種方式解碼。如果你想了解你「發現」的代碼是什麼,你需要告訴我們你在哪裏找到它,或者至少提供更多信息。 – 2012-08-16 15:02:51

+1

相關:http://stackoverflow.com/questions/6325676/having-trouble-sending-three-or-more-packets-consecutively?rq=1 – Patrick 2012-08-16 15:05:04

回答

3

之前,應該前綴的每個字符串,其長度(以字節爲單位,而不是以字符),爲4字節整數。
這樣,服務器就會知道要讀入每個字符串的字節數。

+0

但是如何將每個字符串的長度發送到服務器端? – hrsetyono 2012-08-16 15:01:28

+0

'BitConverter.GetBytes(byteArray.Length)' – SLaks 2012-08-16 15:03:17

+0

@DarcCode - 發送包含該信息的數據包。 – 2012-08-16 15:03:35

相關問題