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 的字符串中。但是,当我尝试将 returndata 与任何内容连接时,不会发生连接。例如:String.Concat(returndata, "test") 返回 returndata,returndata + "test" 也是如此。

有谁知道为什么会这样?

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

4

5 回答 5

5

您是将其分配给字符串还是返回给自身?

returndata = string.Concat(returndata, "test");
returndata += "test";
于 2009-02-13T19:56:03.213 回答
5

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

于 2009-02-13T19:59:03.237 回答
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 以确保删除空终止符。

于 2009-02-13T20:19:03.393 回答
3

我猜一下:

接收到的字符串包含一个 '\0' 终止符。您应该能够使用调试器进行检查。

于 2009-02-13T19:58:57.653 回答
2

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

于 2009-02-13T19:58:23.380 回答