2014-03-12 29 views
5

我在使用.NET 3.5(C#)編寫的TCP服務器\客戶端時出現問題。TCP上的字節[256]限制爲5個字符

每當我使用下面的代碼傳輸數據時,只有5個字符傳輸到服務器。如何修復我的代碼以便我有5個以上的字符傳輸?

TcpClient client = new TcpClient(connectto.ToString(), portto); 
Stream s = client.GetStream(); 
StreamReader sr = new StreamReader(s); 
StreamWriter sw = new StreamWriter(s); 

Byte[] data = new Byte[256]; 
data = System.Text.Encoding.ASCII.GetBytes("auth:" + adminPASS.Text); 

s.Write(data, 0, data.Length); 

data = new Byte[256]; 

String responseData = String.Empty; 

Int32 bytes = s.Read(data, 0, data.Length); 
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

服務器只獲取任何傳輸的前5個字符。其餘的都丟失了。

+1

你能驗證adminPASS.Text是不是空的?寫完之後還要調用s.Flush()。 – payo

+0

即使我添加一個安全措施以確保文本框的值不爲空,但似乎數據仍然沒有通過。我也有一個字符串,文字「連接」,這是在初始連接到服務器發送。在Visual Studio的輸出日誌中,我得到這個「獲得消息連接」,然後直接在它下面獲得「消息」。我也嘗試使用s.Flush(),並沒有改變。 – foxbot

+0

你知道你沒有發送'Byte [256]'數據,你創建了一個256個大數組,但是當你執行'data = System.Text.Encoding ...時,它立即扔掉它''就像你一樣'Byte [] data = ystem.Text.Encoding ...'而不是。 –

回答

0

你的大部分物體都實現了IDisposable,所以需要在using塊中。

A using塊確保調用Dispose方法。在這種情況下,Dispose是什麼會刷新緩衝區並等待發送所有數據。

+1

這聽起來更像是評論而不是答案。詳細說明缺少的IDisposable.Dispose()調用導致觀察行爲的原因將顯着改善答案。 –

1
Byte[] data = new Byte[256]; 

此分配256個字節

data = System.Text.Encoding.ASCII.GetBytes("auth:" + adminPASS.Text); 

此扔掉的256個字節,並轉換 「AUTH:」 + adminPASS.text到字節

s.Write(data 0, data.length) 

發送5個字節+的長度adminPASS.text

它看起來像只發送5個字節左右,特別是如果adminPASS.text爲空

+0

這是很好的信息,但丟失的數據很可能是由於緩衝區沒有被刷新(參見John的回答和@ payo的評論)。 –

+0

從標題中可以看出,他預計要傳輸256個字節。這當然不是。你是對的,一個沖洗'可能'的幫助,但是不太可能,因爲發送這樣一個小消息是罕見的,所以如果他得到5個字節,那麼沖洗不太可能會影響它 – NebulaSleuth

3

Stream.Read可以返回比請求更少的字節,所以你需要調用它在一個循環中達到EOF直到,像這樣:同樣

int bytes; 
int offset = 0; 

while ((bytes = s.Read(data, offset, data.Length - offset) != 0) 
{ 
    offset += bytes; 
} 

,你永遠不Dispose()您的視頻流,所以很可能是他們AREN不會臉紅。圍繞您的所有IDisposable對象使用using statement

+0

我試過了您所說的Stream.Read函數的代碼...迄今爲止它只導致客戶端掛起並停止響應。我是否也需要將此代碼添加到流編寫器中? – foxbot

+1

@themsftcpu正如他所說,它會循環直到達到EOF的末尾,因此發送者需要關閉連接來停止循環。如果你正在嘗試填充'data.Length'字節,你可以在開始處添加一個'offset

0

沒關係,用於獲取字符串到服務器上使用的原代碼,

mstrMessage = mstrMessage.Substring(0, 5); 

所以它只是讀第5個字節的數據。將其更改爲bytesReceived.Length並且它工作正常。