2009-02-13 84 views
0
// Reads NetworkStream into a byte buffer. 

NetworkStream ns; 
System.Net.Sockets.TcpClient client = new TcpClient(); 

byte[] receiveBytes = new byte[client.ReceiveBufferSize]; 
ns.Read(receiveBytes, 0, (int)client.ReceiveBufferSize); 
String returndata = Encoding.UTF8.GetString(receiveBytes); 

我成功从客户端读取并将结果存储到名为returndata的字符串中。但是,当我尝试将任何连接返回数据时,不会发生串联。例如:String.Concat(returndata,“test”)返回returndata,就像returndata +“test”一样。C#字符串将不会连接

有谁知道为什么会发生这种情况?

编辑:史蒂夫W是正确的;我后来发现returndata.Length总是返回8192.

+0

如果您显示您遇到问题的实际代码会更好。你已经发布了你正在工作的代码,并忽略了你没有的代码。 – AnthonyWJones 2009-02-13 19:59:07

+0

你可以包含连接的代码吗? – 2009-02-13 19:59:08

+0

@tacogordito:你检查了ns.Read()的返回值吗? – 2009-02-13 20:02:57

回答

4

我相信这个问题与不跟踪读取的总字节数有关。您设置为ReceiveBufferSize的字节缓冲区比读取的实际字节数多得多。通过考虑读取的实际字节数,然后将其传递给Encoding.UTF8.GetString()方法,您应该获得可以连接的有效字符串。这里有一个例子:


NetworkStream ns; 
System.Net.Sockets.TcpClient client = new TcpClient(); 

byte[] receiveBytes = new byte[client.ReceiveBufferSize]; 
int bytesRead = ns.Read(receiveBytes, 0, receiveBytes.Length); 
String returndata = Encoding.UTF8.GetString(receiveBytes,0,bytesRead); 
returndata = returndata.Trim(new char[] {'\0'}); 

还要注意关于阅读一空终止,并包括在它读取的字节也可能是一个问题的其他建议。我已经包含了字符串的Trim以确保删除空终止符。

5

您是将它分配给一个字符串还是它自己?

returndata = string.Concat(returndata, "test"); 
returndata += "test"; 
2

字符串是不可改变的。 这意味着,当你添加(连接)另一个字符串到你的字符串时,你会收到一个新的字符串实例。
原始字符串本身不会被更改。

3

我会猜测:

收到的字符串包含'\ 0'终止符。你应该能够用调试器来检查。

5

为了扩大jhunter的答案,Concat方法不会改变原始字符串变量的内容,它只是返回的连接结果。如果您希望返回数据包含并置结果,则需要使用returndata = string.Concat(returndata, "test")