日期:2014-05-19  浏览次数:20720 次

问个有关socket笨笨的问题
很多地方都只讲了两个的区别。那么什么情况下应该用异步Socket通讯,什么情况下应该用同步Socket通讯阿?

------解决方案--------------------
个人觉得,在接收数据量小的情况下,用同步比较好,而在处理数据量大的时候用异步处理,比如FTP客户端收发FTP命令及消息的时候,用同步比较好,而在下载或上传时用异步比较好

而且异步可以获取当前收发的数据量,如果要断点续传的话可以很好的继续前次的工作

不过同步也有不好的时候,就是会阻塞当前线程,一定要完成了才能继续下一步的内容,而异步只需要让它开始,就可以不用管它了,继续后面的工作。根据需要,在异步完成时由异步的回调函数返回一个结果或需要的信息加以确认就好了。

在进行网络编程的时候,一般采用异步通讯比同步要好些,毕竟让用户在等待、处理网络数据的时候可以进行其他操作,而不用等待操作完毕才能继续后续工作

个人学习2个月C#网络程序设计的一点点体会,还请其他高手赐教!
------解决方案--------------------
要视情况而定

例如, 你的project里面有个DataGridView, 通过Socket去某个Server上听数据, 于是

1. SyncSocket...
在网络很顺畅的时候, 你的DataGridView数据会很快被填上, 整个UI不会被卡住, 而每个数据都是从Server那边听一个填一个, realtime的, 不过, 想想, 如果网络不好, 每个数据从Server那边要听一段时间(let say, 10分钟的样子), 这时, 你的UI就会在一直等待Socket的数据回来, 结果就卡在那了, 客户看到的就是, 程序几乎死掉了

2. AsyncSocket...
UI不会等待数据从Server那边听回来, 而是开多条线程, 当数据被听回来了, 就抛出Event, 你就应该在Event里面把数据填到DataGridView里面去, 而这并不会影响MainThread的运行, 结果, 程序会很正常的运行, 不会因为从Server端听不回来数据而死在那里, 在网络很好的时候, 你会发现它和SyncSocket的效果差不多, 但在网络差的时候, 你又会发现, DataGridView里面的数据, 很多都没填完, 那是因为AsyncSocket还没从Server那边把数据拿回来, 等它拿回来了, 自己会填上的, 你不用担心


那, 为什么不全部都用AsyncSocket?
很明显, 有时候, 我们必须等某个数据从Server那边听回来, 不然就无法进行下一步, 这个时候是不能用AsyncSocket的, 因为我们要顺序的等某数据回来