`

C# socket连接服务器发送和接收数据在设置断点单步执行没有问题但是直接运行不能成功

阅读更多

       题目有点长,又一次感受到自己表达能力的欠缺,其实问题大概是这样的:由于工作需要用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

0
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics