C# NetStream

标题:NetStream

关注点:Read、Write

正文:

  int size = Read(buf, 0, buf.length);

  这里一次会读入length个字节,如果小于这个数量,后面的就是垃圾数据,我当时被这个搞懵了,看了两天才找出问题,我是直接读入到buf,然后通过Encoding.Default.GetString(buf)得到字符串的,结果半天没发现问题,输出时显示也正常(...),其实字符串的长度是buf.length,只有当取出字符串的长度时才发现异常!Read的返回值表示实际读入的数据数量,之后可以调用Encoding.Default.GetString(buf, 0, size);得到正确的字符串。

  现在新的问题出现,如果对方write的数据大于这个值,后面的就会停在缓冲区,等待下次的接收,这里很可能又会出问题(一次发送的一次解决,特别是在开头加上控制字符的情况下)。所以我们可以判断,如果size == buf.length,那么就继续接收,然后多次接收的结果组合到一起。但是对方发送的数据正好的buf.length大小就会出错,因此双方可以规定如果发送的数据是buf.length的整数倍,那么后面加上"#END"再进行发送,而接收方收到单独的#END就也表示一次读入结束。 

 1 class MyNetStream
 2   {
 3     public const int MAX = 5;
 4     NetworkStream stream;
 5     public MyNetStream(NetworkStream stream)
 6     {
 7       this.stream = stream;
 8     }
 9     public string Read()
10     {
11       string ret = "";
12       byte[] buf = new byte[MAX];
13       int size;
14       do
15       {
16         size = stream.Read(buf, 0, buf.Length);
17         string s = Encoding.Default.GetString(buf, 0, size);
18         Console.Write(s + "size = " + size);
19         if (!s.Equals("#END")) ret += s;
20         else break;
21       } while (size == MAX);
22       return ret;
23     }
24     public void Write(string s)
25     {
26       byte[] buf = Encoding.Default.GetBytes(s);
27       if(buf.Length % MAX == 0)
28       {
29         buf = Encoding.Default.GetBytes(s + "#END");
30       }
31       stream.Write(buf, 0, buf.Length);
32     }
33   }
时间: 2024-10-20 05:56:22

C# NetStream的相关文章

netstream播放rtmp直播流卡顿

标准的flash播放器ActionScript3语句,播放flash publish的rtmp流,NetConnection--->NetStream--->play--->attachNetStream然而项目中这么做,一直处于卡顿状态.后来添加了一句 nsPlayer.bufferTime = 0.1; 居然不卡顿了.帮助文档说:The default value is 0.1 (one-tenth of a second). To determine the number of s

用NetStream的appendBytes播放FLV

public class MiniStream extends Sprite { private var _buffer:ByteArray = new ByteArray(); private var _ns:NetStream; private var _nc:NetConnection; private var _video:Video; private var _tc:Number = 0; private var _ustream:URLStream; private var _ela

NetStream.appendBytes, 走向Flash P2P VOD的第一步

之前被告知可以自行实现Flash p2p的点播功能, 但一直疑惑, 印象中NetStream并未提供相关方法, 前天看订阅时发现的文章: ByteArray Access to NetStream in Flash Player 10.1 [ by Thibault Imbert ] 进而找到文档: NetStream.html#appendBytes() 看过上述两篇文章后, 对appendBytes这个方法有一定了解, 简单来讲就是在数据生成模式下提供NetStream音视频数据供其播放.

FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法

http://25swf.blogbus.com/tag/FluorineFx/ FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法 在FLASH里,假如在一个方法里,同事使用几个不同的NetStream.play 一个相同的标识,会发现只有一个能正常播放. 进行以下修改 RtmpConnection.cs 里的NewPlaylistSubscriberStream 方法if (streamId < StreamId)        return null;改

Flex中NetConnection与NetStream的关系、及浏览器并发连接数测试[转]

最近在做一个基于BS结构的视频会议系统,决定采用开源的FluorineFx.net与Flex结合的方法进行开发,前期开发都非常顺利,包括同步白板等.但到了实时视频传输的时候,原本设计是每个客户端可以显示三路视频,但到IIS上测试的时候,发现状态很不稳定,偶尔可以全部显示出来,大部分情况下,客户端总是随机显示一个或两个.查询了ActionScript的技术文档.FluorineFx的技术文档等,也没有找出与这个问题相关的描述,包括网络上,对NetConnection与NetStream的对应关系也

NetStream 记录

bufferLength : Number [只读] 数据当前存在于缓冲区中的秒数.(已进入缓冲区的秒数) bufferTime : Number 指定在开始显示流之前需要多长时间将消息存入缓冲区.(默认0.1秒, 缓冲区大小,就是需要bufferLength要达到0.1才能播放显示) bufferLength / bufferTime - 已缓冲的百分比 bytesLoaded - 已下载的字节数 bytesTotal - 总字节数 bytesLoaded / bytesTotal - 已下载

rtmplib rtmp协议过程分析

转自:http://chenzhenianqing.cn/articles/1009.html 写的很好,收藏如下,向作者致敬! 没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据. 代码在这里:git clone git://git.ffmpeg.org/rtmpdump 先看一段通过librtmp.so库下载RTMP源发布的数据的例子,从rtmpdump中抽取出来.使用的大体流程如下: RTMP_Init主要就初始化了一下RTMP*rtmp变量的成

转:system.Security.Cryptography C# 加密和解密

以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先加密输入的密码,再进行和数据库里的比对,因为同一字符串加密后是一样的,并不是无规则的:实例: string name = this.TextBox1.Text;        string pwd = System.Web.Security.FormsAuthentication.HashPassw

C# Socket流数据大小端读写封装

网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换.c#类库IPAddress已经封装了大小端的转换. 封装代码如下: [csharp] view plain copy using System.IO; using System.Net; using System; namespace Framework { public class NetStream { private MemoryStream stream; private BinaryReader read