收藏 分享(赏)

基于c#局域网视频聊天设计.doc

上传人:无敌 文档编号:630367 上传时间:2018-04-15 格式:DOC 页数:35 大小:291KB
下载 相关 举报
基于c#局域网视频聊天设计.doc_第1页
第1页 / 共35页
基于c#局域网视频聊天设计.doc_第2页
第2页 / 共35页
基于c#局域网视频聊天设计.doc_第3页
第3页 / 共35页
基于c#局域网视频聊天设计.doc_第4页
第4页 / 共35页
基于c#局域网视频聊天设计.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、- 0 -1 绪论视频监控是各行业重点部门或重要场所进行实时监控的物理基础,管理部门可通过它获得有效数据、图像或声音信息,对突发性异常事件的过程进行及时的监视和记忆,用以提供高效、及时地指挥和高度、布置警力、处理案件等。本系统采用 DirectShow 网络组播技术实现了视频捕获、视频压缩、网络传输、视频解码和实时回放,减小了网络带宽占用,高效的传输视频数据,独立于硬件。可扩展性好。完全利用现有 1P 数据网络传输数据不需要单独布线,显著降低了系统成本,缩短了系统开发周期,并且可以容易的实现远程监测2 Windows 服务一个 Windows 服务程序是在 Windows 操作系统下能完成特定

2、功能的可执行的应用程序。Windows 服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的 Windows 服务程序,它们在 Windows 启动或是重启之后用户登录之前就开始执行了。而对于手动启动的 Windows 服务程序,你可以通过命令行工具的 NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的 Windows 服务程序。同样,一个 Windows 服务程序也不能像一般的应用程序那样被终止。因为 Windows 服务程序一般是没有用户界面的,所以你也要

3、通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得 Windows 服务程序自动停止。因为 Windows 服务程序没有用户界面,为了能使一个 Windows 服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows 服务程序的应用范围很广,典型的 Windows 服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web 和文件系统服务等功能。2.1 添加文件监视服务将生成的服务名为 Webcamservice 的服务添加视频监视功能: 首先,在 C 盘创建文件夹 w 将程序生成的 debug 中的文件复制到 w 文件夹 在

4、C/windows/搜索 installutil.exe 执行文件,将其复制到 w 文件夹- 1 - 启动 cmd,打开命令提示符窗体键入如图 2-1 所示图 2-1 添加服务功能 用 net start 命令启动服务 Webcamservice 如图 2-2 所示图 2-2 启动 Webcamservice- 2 -3 项目的设计原理3.1 DirectShow 技术采用网络摄像机的远程视频监控具有录像时间长、图像质量好、查询速度快等优点,目前应用非常广泛。对于网络摄像机传输的视频数据,需要专门的 Filter 来处理并在DirectShow 的框架下或回放,或保存。监控服务器通过 Inte

5、rnet/Intranet 轮询网络摄像机获取视频。本文以视频数据接收 Filter 的设计过程介绍基于 DirectShow 的视频数据流的传输以及通过自定义的通讯协议的数据解析过程和 Filter 程序设计与实现过程。DirectShow1 是微软公司在 ActiveMovie 和 Video for Windows 的基础上推出的基于COM 的流媒体处理的开发包,与 DirectX 开发包一起发布。 DirectShow 为多媒体流的捕捉和回放以及二次开发提供了强有力的支持。运用 DirectShow,可以很方便地从支持 WDM 驱动模型的采集卡上采集数据,并且调用其 API 函数进行后

6、期处理。它广泛地支持各种媒体格式,包括Asf,Mpeg,Avi,Dv,Mp3,Wave 等等,使得多媒体数据的回放变得轻而易举。DirectShow 是一个开放的框架,因此只要有合适的 Filter 来分析和解码,可以支持任何格式。3.2 TCP/IP 协议在 TCP/IP 协议组分两种协议:网络层的协议,应用层的协议 网络层协议 网络层协议管理离散的计算机间的数据传输。这些协议是在系统表层以下工作的。比如,IP 协议为用户和远程计算机提供了信息包的传输方法。它是在许多信息的基础上工作的,好比说是机器的 IP 地址。在机器 IP 地址和其它信息的基础上,IP 确保信息包能正确地到达目的机器。通

7、过这一过程,IP 和其它网络层的协议共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的 IP。 应用层协议相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。用户为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。 IPIP 层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP 或 UDP 层;相反,IP 层也把从 TCP 或 UDP 层接收来的数据包传送- 3 -到更低层。IP 数据包是不可靠的,因为 IP 并没有做任何事情来确认数据包

8、是按顺序发送的或者没有被破坏。IP 数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址) 。高层的 TCP 和 UDP 服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP 地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。 TCP如果 IP 数据包中有已经封好的 TCP 数据包,那么 IP 将把它们向上传送到 TCP 层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP 数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP 将它的信息送到更高层的应用程序,例如 Telnet 的服务程序

9、和客户程序。应用程序轮流将信息送回 TCP 层,TCP层便将它们向下传送到 IP 层,设备驱动程序和物理介质,最后到接收方。3.3 C/S 架构在 网 络 连 接 模 式 中 除 对 等 网 外 ,还 有 另 一 种 形 式 的 网 络 , 即 客 户 机 /服 务 器 网 ,Client/Server。 在 客 户 机 /服 务 器 网 络 中 , 服 务 器 是 网 络 的 核 心 , 而 客 户 机 是 网 络 的基 础 , 客 户 机 依 靠 服 务 器 获 得 所 需 要 的 网 络 资 源 , 而 服 务 器 为 客 户 机 提 供 网 络 必 须 的资 源 。图 3-1 c/s

10、结构4 程序流程图及设计4.1 程序时序图与系统架构本系统采用面向连接的客户/服务模型,服务器必须首先启动,否则客户进程的Connect()系统调用将返回错误代码表示连接失败。无连接的服务进程也必须首先启动以指定本地的套接字地址否则客户进程的数据服务请求传送不到服务器进程。服务器客户端客户端.- 4 -面向连接的 c/s 时序图如图 4-1 所示图 4-1 程序时序图系统由服务器终端采集传输系统和客户端接收系统两部分组,系统构架如图 4-2 所示图 4-2 系统架构Accept()Recv()Send()Close()Listen()Bind()Socket()服务器发送数据-确认发送数据-请

11、求建立连接Recv()Close()Send()Connect()Socket()客户摄像头采集卡服务器服务程序网络传输模块 网络接收模块客户端程序解码显示视频流 控制指令 视频流 控制指令- 5 -4.2 程序设计分析4.2.1 任务目标服务器端程序目标:服务器服务器端服务程序进行数据采集(捕捉摄像头捕获数据) ,提供IP 端口实现数据流的传输。客户端程序目标:客户端程序通过 IP 协议与服务器端通信,接收并回放服务器端采集的视频数据流。4.2.2 程序描述Socket 类:socket 之间的连接可以分为三种类型:客户端连接,监听连接以及服务器端连接。客户端连接是指由客户端的 socket

12、 提出连接请求,要连接的目标是服务器端的 socket。为此,客户端的 socket 必须首先描述它要连接的服务器端socket(主要是指服务器 端 socket 的地址和端口号),然后再定位所要连接的服务器端 socket,找到以后,就向服务器端 socket 请求连接。当然,服务器端的 socket 此时未必正好处于准备好状态,不过,服务器端的 socket 会自动维护客户请求连接的队列,然后在它认为合适的时候向客户端 socket 发出“允许连接“ (accept)的信号,这时客户端 socket 与服务器端 socket 的连接就建立了。监听连接,服务器端 socket 并不定位具体的

13、客户端 socket,而是处于等待连接的状态。当服务器端 socket 监听到或者说 接收到客户端 socket 的连接请求,它就响应客户端 socket 的请求建立一个新的 socket 句柄并与客户 端连接,而服务器端 socket 继续处于监听状态,还可以接收其它客户端 socket 的连接请求。服务器端连接,是指当服务器端 socket 接收到客户端 socket 的连接请求后,就把服务器端 socket 的描述发给客户端,一旦客户端确认了此描述,连接就建立了。在本文中的聊天程序用的就是监听连接,即服务器设置连接个数后进行监听,客户端进行对服务器端的连接,这样就可以进行相互通信了。Tc

14、pService 类namespace TCPinternal class TcpServer : IDisposable- 6 -/ This is not the max number of connections you can have, its the number/ that can queue up waiting for you to Accept them. If more than MAXCONNECTION/ more clients try to connect while you are servicing another, OnConnect is/ probabl

15、y taking too long.const int MAXCONNECTIONS = 3;#region Member variablesprivate ArrayList m_aryClients;private Socket m_sockListener;private volatile bool m_bShuttingDown;private ManualResetEvent ShutDownReady;#endregion/ Return an array of the ip addresses assigned to this pcpublic static IPAddress

16、GetAddresses()IPAddress aryLocalAddr = null;string strHostName = “;/ NOTE: DNS lookups are nice and all but quite time consuming.strHostName = Dns.GetHostName();#if USING_NET11IPHostEntry ipEntry = Dns.GetHostByName( strHostName );#elseIPHostEntry ipEntry = Dns.GetHostEntry( strHostName );#endifaryL

17、ocalAddr = ipEntry.AddressList;/ Verify we got an IP address.if( aryLocalAddr = null | aryLocalAddr.Length 1 )throw new Exception( “Unable to get local address“ );return aryLocalAddr;public TcpServer(int nPortListen)_TcpServer(nPortListen, GetAddresses()0);- 7 -public TcpServer(int nPortListen, IPAd

18、dress ip)_TcpServer(nPortListen, ip);/ Shut down the listenerpublic void Dispose()/ Shutting down is a real PITA. You cant close the listener/ while there is an outstanding async call active. And you cant/ cancel the async call. Grr. As a workaround, this routine/ makes a connection to the port. The

19、 OnConnect routine, recognizing/ that we are in shutdown, doesnt create a new async call.TcpClient t = null;/ Only want one thread to be preforming shutdown at a time.lock (this)/ Have we already shutdown?if (!m_bShuttingDown)m_bShuttingDown = true;/ Disconnect each clientforeach (SockWrapper s in m

20、_aryClients)trys.Client.Shutdown(SocketShutdown.Both);s.Client.Close();catch m_aryClients = null;/ Connect to the port to trigger the async listenerIPEndPoint ep = (IPEndPoint)m_sockListener.LocalEndPoint;t = new TcpClient(ep.Address.ToString(), ep.Port);if (t != null)/ Listen for the async listener

21、 to let go. This must be done- 8 -/ outside the crit section since the listener needs to lock it.ShutDownReady.WaitOne(3000, false);lock (this)/ close everything downm_sockListener.Close();m_sockListener = null;t.Close();ShutDownReady.Close();ShutDownReady = null;TcpServer()/ If Dispose is not calle

22、d against our class and the destructor is / called, some of the member variables in this class have already / been disposed. Such being the case, theres no way to clean up / nicely. Moral: Always call Dispose./Dispose();/ Send to all connected clientspublic void SendToAll(MemoryStream m)_SendToAll(m

23、.GetBuffer(), (int)m.Length);public void SendToAll(byte b)_SendToAll(b, b.Length);public int Connectionsget return m_aryClients.Count; public event TcpConnected Connected;public event TcpConnected Disconnected;public event TcpReceive DataReceived;- 9 -public event TcpSend Send;private void _TcpServe

24、r(int nPortListen, IPAddress ip)try/ Initialize member varsm_aryClients = new ArrayList(5);ShutDownReady = new ManualResetEvent(false);m_bShuttingDown = false;/ Create the listener socket in this machines IP addressm_sockListener = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolT

25、ype.Tcp );m_sockListener.Bind( new IPEndPoint( ip, nPortListen ) );m_sockListener.Listen( MAXCONNECTIONS );/ Setup a callback to be notified of connection requestsm_sockListener.BeginAccept( new AsyncCallback( OnConnectRequest ), m_sockListener );catchm_bShuttingDown = true;throw;private void _SendToAll(byte b, int iLength)lock (this)if (!m_bShuttingDown)foreach (SockWrapper s in m_aryClients)_SendOne(s, b, iLength);private void _SendOne(SockWrapper s, byte b, int iLength)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 管理论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报