日期:2014-05-18 浏览次数:21157 次
FileStreamPacket fsp = packet as FileStreamPacket; System.IO.FileStream fs = new System.IO.FileStream(fsp.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, FileShare.Read); fsp.SeqID = 0; fsp.SeqCount = (int)System.Math.Ceiling(fs.Length / (decimal)MAXBUFFERSIZE); fsp.PacketID= fsp.GetHashCode(); long pos = 0; long count = fs.Length < MAXBUFFERSIZE ? fs.Length : MAXBUFFERSIZE; while (pos < fs.Length && count>0) { byte[] buffer = new byte[count]; fs.Seek(pos, SeekOrigin.Begin); fs.Read(buffer, 0, (int)count); pos += count; count = pos + MAXBUFFERSIZE < fs.Length ? MAXBUFFERSIZE : fs.Length - pos - 1; //数据包重组 fsp.SeqID = fsp.SeqID + 1; fsp.Message = Convert.ToBase64String(buffer); //发送数据 byte[] buf = UtilityHelper.Serialize(fsp); client.Send(buf, buf.Length, toUser.P2PAddress); Thread.Sleep(300); }
------解决方案--------------------
http://download.csdn.net/source/635565
http://download.csdn.net/source/820806
http://www.cnblogs.com/evernory/articles/22178.aspx
------解决方案--------------------
这样的问题对于我这样的新手实在是太难了.
不过我手里的一本书 <<C# 高级编程>> (第六版)
第47章 是讲解P2P 对等网络的 讲的还算详细
新手,还看不懂.
------解决方案--------------------
首先,我不太清楚你要实现的是个什么东东,但是无非就是视频与音频数据的传输.现在假使有终端A和B.
1.首先流媒体的传输需要把一个把媒体文件变成二进制的过程,然后传到接受端要变回媒体文件,这如何实现?
答:编码与解码.A和B之间建立连接之后,通常是在二者之间开一条RTP通道,数据是通过这个RTP通道实现P2P方式传递的.
以音频传递为例,视频同理.A端捕获到数据之后进行编码,例如对音频可以使用G711编码方式编码.编码之后通过RTP通道传递数据到B端指定的端口,B端有个监听的机制,用来监听这个端口,当收到数据之后进行解码,解码之后播放.
2.传输的媒体文件是分成固定大小的包的,而且要能对包进行定位,比如一个接收端需要哪个时间的文件,就请求。我的问题是怎么进行这种包的控制,如何进行打包。
答:包的大小是根据你选择的编码方式来决定的,不同的编码方式应该选择不同的包大小.对数据包的控制通常使用协议栈控制,其实就是RTP协议,可以使用开源的协议栈:ortp或jrtp.时间的控制是通过时间戳控制的.最好熟悉一下RTP/RTCP协议.
另外,如果你的软件不大,要求不高,可以自己定义协议,数据的封包也可以自己定义,包括包头和数据部分,具体根据实际情况.
如果你的软件对控制要求比较高,这个时候就要考虑自己写一个协议栈或者使用开源的协议栈了,例如可以使用sip协议信令进行控制. SDP协议描述媒体以及协商媒体.