题目有点长,又一次感受到自己表达能力的欠缺,其实问题大概是这样的:由于工作需要用C# socket(第一次使用)写了一个client连接服务器,发送和接收数据包——当然要求能同时发送和接收数据包,接收到就进行处理。我首先想到了要异步处理,C# socket也提供了异步的相关操作,然后我设置断点(基本上socket操作的每个函数都设置了断点让其进入)单步执行(F10),发现都没有问题可以发送和接收数据,但是直接运行(F5)就是不能成功,后来发现问题的原因是connet操作(调用的BeginConnect)是异步的,就是不会阻塞主程序,这样会导致connect操作没有成功,就何来的后续操作(发送和接收数据包),可以发现设置断点然后按F5始终不会进入连接完毕的操作和发送和接收数据包的操作。所以解决方法就是只要保证socket连接操作顺利完成——直接使用Connect进行连接,或者是我找到的一个解决方法是使用 ManualResetEvent。
就不贴代码了,说的很没有逻辑,我想只有碰到过这样问题的人才能看懂吧,也没有时间倒腾了,如果你有问题可以留言。
这个问题我足足用了一天才解决的,请教了公司的很多同事,都素手无策,然后CSDN上有人说了这个问题但是跟我不太一样,也没有找到解决方法。然后我就一直在找人家贴出来的代码,终于被我发现51CTO(查看猛点)上有人用了ManualResetEvent,就有眼前一亮感觉,就赶紧研读了下,就这样把我的问题解决了。
然后再使用C#进行二进制数据包传输的时候要注意大小端和编码的问题。很可能你使用Java开发的时候是没有问题的,但是改用C# 就有问题了,因为C#是进行小端字节序存储的,而网络流的是用大端字节序进行发送的。还有一个问题是不同语言直接要把编码一致,比如我使用C# 的Unicode编码方式把英文字符串转出byte数组,然后Java在另一端解析字符之间会多出空格,这就是编码方式不一致的问题,C#使用的是UTF16,而Java端使用UTF8,所以会多出空格。
问题是很多的,但是总不会无中生有的,只要认真分析总能找到问题所在和解决方法。
转载请在文首注明出处:http://dsqiu.iteye.com/blog/1882308