【问题标题】:Losing characters over socket in string在字符串中的套接字上丢失字符
【发布时间】:2013-03-26 08:17:30
【问题描述】:

我正在通过套接字发送消息。 在客户端,我正在使用 StringBuilder 组装消息

StringBuilder sb = new StringBuilder(message);
sb.Insert(0, (char)11);
sb.Append((char)28);
sb.Append((char)13);

从客户端发送到服务器

Byte[] data = new Byte[1024];
data = Encoding.ASCII.GetBytes(message.ToString());
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);

服务器端

StringBuilder message = new StringBuilder(Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length));

然后我想检查我的消息是否包含在正确的容器中,但由于某种原因,检查中的最后 2 个字符等于 0 而不是正确的 28 和 13。

if (((int)messsage[message.Length - 2] == 28) && ((int)message[message.Length - 1] == 13))

提前感谢您的帮助

添加了要求的数据

byte[] bytes = new byte[1024];
NetworkStream stream = tcpClient.GetStream();
stream.Read(bytes, 0, bytes.Length);

【问题讨论】:

  • bytesReceived.Length 的值是多少?您能否还显示用于读取字节的代码。
  • 很可能你正在调用从客户端读取数据,给它一定数量的字节来读取,但它并没有全部读取。读取调用返回的字节数可能比您要求的要少,然后您需要检测到这一点并要求更多。正如 ChrisF 所要求的,我们需要查看从网络流中读取的代码
  • 查看stream.Read()的返回值...告诉你实际读取了多少字节
  • 您的代码表明您正在一个名为 sb 的 StringBuilder 中构建调整后的消息,但您似乎正在发送原始消息变量。您是在此处显示的代码之外设置 message 等于 sb.ToString() 还是您的意思是使用 sb.ToString() 而不是 message.ToString()?
  • 我已经添加了要求的额外代码,我确定这就是问题所在。正在发送的数据,它的长度会有所不同,所以我猜我不能这样声明它?

标签: c# sockets tcp tcplistener


【解决方案1】:

Stream.Read 最多会读取bytes.Length 字节,它的返回值会告诉你它实际读取了多少字节。

如果这还不够,那么您需要再次致电Stream.Read()

另外,bytes.Length 将始终返回数组的长度,而不是读取的字节数。

查看您的发送代码,您可能希望尽可能多地从流中读取,将读取的内容附加到字符串生成器,然后检查最后 2 个字符是否为 28 和 13,以及它们是否是那么你就有了完整的信息。

【讨论】:

  • 非常感谢您的意见。我已经纠正了我遇到的问题。做 { bytesRead = stream.Read(buffer, 0, buffer.Length); completeMessage.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead)); } while (stream.DataAvailable);
猜你喜欢
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2018-04-22
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多