byte[] lengthBytes = new byte[4];
serverStream.Read(lengthBytes, 0, 4);
MessageBox.Show("'>>" + System.Text.Encoding.UTF8.GetString(lengthBytes) + "<<'");
MessageBox.Show("Hello");
这是我用于调试的代码。我现在收到2个留言箱。如果我使用Debug.WriteLine,它也会打印两次。
Msgbox 1: '>>/ (Note that this is still 4 characters long, the last 3 bytes are null.
Msgbox 2: '>>{"ac<<'
Msgbox 3: Hello
我正在尝试使用整数(消息的长度)发送4个字节。这很好('/'是47的utf8)。问题是消息的前4个字节也被读取('{“ac')。我完全不知道这是怎么发生的,我已经调试了几个小时了,我只是无法理解我的一个朋友建议在StackOverflow上创建一个帐户,所以我在这里:p
感谢所有帮助:)
答案 0 :(得分:2)
你正在制造传统的程序员错误,每个人都必须做一次,以学习如何避免和正确行事。这主要是通过编写有缺陷的调试代码并使 lot 更难找到错误来实现的:
这里使用的正确工具是真正冻结程序的功能。调试器断点。
这里使用的正确工具是调试器手表或工具提示,它可以让您直接查看数组。如果您必须生成诊断字符串,请使用BitConverter.GetString()。
正确的解决方案是继续调用Read(),直到您倒计数您希望从之前读取的 length 接收的字节数。你需要一个MemoryStream来存储你得到的byte []的块。
答案 1 :(得分:1)
关于Encoding.GetString()的this link可能会帮助你。要注意的部分是:
如果要转换的数据仅在顺序块中可用 (,例如从流中读取的数据)或者数据量是否过大 它需要分成更小的块,你应该使用 由派生类的GetDecoder方法返回的解码器对象。
答案 2 :(得分:1)
问题是我启动了getMessage void 2次。这开始了2次(在不同的线程中)。
埃尔贡佐帮助我找到了问题,他是个好人:)