首页 新闻 会员 周边

.net Socket通信接收数据问题

0
悬赏园豆:10 [已关闭问题] 关闭于 2010-10-08 09:35

问题描述:

     我现在已经建立好一个TCP Socket连接。对接收数据的处理有两种方案:

       第一种,对Socket进行网络流串接,也就是用NetWorkStream类封装一下已连接的Socket,即前生一个NetWorkStream实例,然后用流统一的Read(或异步方式BeignRead)读取数据。

       第二种,直接接调用已连接的Socket对象接收数据。

 提问:这两种方式有没有效率上的差异?

       如果要对接收到的字节数据组进行处理,也有两种方式常见方式。

第一种:MemeoryStrem ms=new MemeoryStream(接收数据的字节数组名....);BinaryStream binr=new BinaryStream(ms),然后用binr来读取。

第二种:就是把第一种中的MemeoryStream换成BufferdStream,其它不变。  

   提问:这两种处理方式,有没有效率差异,或有没有效率更好的办法?

问题补充: 关于那个BufferedStream与MemoryStream的问题提问有错误,大家不要见笑。 我在另一个论坛中看到类型的贴子:The BufferedStream class is a concrete class that extends the Stream class and is used to provide an additional memory buffer to another type of stream, both synchronously and asynchronously. The BufferedStream class must be configured to either read or write when an instance of the class is created, but the BufferedStream cannot be configured to perform both the tasks at the same time. 就我的理论来说,TCP是不会丢包的。这几天我也找了一些资料,我认为socket直接调用Receive接收与networkstream串接Socket后用read接收效率应该是一样的或差别不大,因它们的原理都是从同一缓冲区中把数据copy出来。有的朋友说BufferedStream串接NetworkStream效率更高,其原因是因为BufferedStream在Socket缓存的基础上又增加的了一个缓存,默认大小为4096字节,在其重载的构造函数中可以改变这个大小。
X教授的主页 X教授 | 菜鸟二级 | 园豆:240
提问于:2010-09-23 12:48
< >
分享
所有回答(3)
0

BufferdStream比较省事。你需要编写的代码很少。

第一种编写比较复杂。

需要提醒你的是你的客户端和服务器端最好用同一种。否则内容超过1M容易丢包(我也不知道为什么,可能我的水平太烂)。

我以前写过一个传输文件的,你要参考可以发邮件给我。

另外效率都不高,通过流量统计我发现,我用了5G的流量传输了一个3.5G的文件。。。

后来测试了LEAP FTP的客户端对ServU的服务器端,发现也差不多。

Jerry Young | 园豆:435 (菜鸟二级) | 2010-09-23 14:16
我在国外的一些论坛上也看了关于BufferedStream的说法,说它是对其它流的一个扩展,为其它的流类提供了另外一人缓冲区。还有一些说法是,.net中基于BufferedStream对各种I/O流进行了优化,如果再用BufferedStream是串接其它流,就有两种缓冲区。觉得好含糊。我现在也不太明白。
支持(0) 反对(0) X教授 | 园豆:240 (菜鸟二级) | 2010-09-23 22:00
“第一种编写比较复杂”,复杂倒不会,关键我想知道效率,微软为什么加了一个networkStream类的read去接收数据,为什么不直接用Socket的Receive,哪一种效率更高,我在网上找了一下,感学都是很模糊。
支持(0) 反对(0) X教授 | 园豆:240 (菜鸟二级) | 2010-09-23 22:04
Socket的Receive.我试过太容易丢数据了.我又不想一个字符一个字符的传,所以最后放弃这种方式.
支持(0) 反对(0) Jerry Young | 园豆:435 (菜鸟二级) | 2010-09-23 23:00
0

1. 仅从读写的速度来看,要看这2个类调用的API是哪个?用内核API读取文件的快。

2. 通信系统中,应用协议的好坏是决定效率的重要因素。参考:http://www.cnblogs.com/wildman/archive/2009/07/06/1517629.html

野男人 | 园豆:205 (菜鸟二级) | 2010-09-23 22:42
1、这两个类调用的API应该是一样的。 2、我现在的通信必须传输层必须选择TCP通信,因不能丢包。对于效率的提高,我只是想在接收数据之后,以数据处理时,以哪种方式读取效率更高。
支持(0) 反对(0) X教授 | 园豆:240 (菜鸟二级) | 2010-09-23 22:59
-1

我以前写过一篇,你看看对你有没有用

http://www.cnblogs.com/eaglet/archive/2009/11/04/1595887.html

eaglet | 园豆:17139 (专家六级) | 2010-09-24 11:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册