DirectShow开发音视频聊天程序

DirectShow开发音视频聊天程序
DirectShow开发音视频聊天程序

DirectShow开发音视频聊天程序

当下比较流行的即时通信工具,比如MSN,QQ等都实现了视音频的功能,通过视频,音频,我们可以更好的和朋友通过网络进行沟通,本文通过DirectShow技术模拟QQ实现了视频和音频的采集,传输,基本实现了QQ的视音频聊天的功能。

网络视音频系统主要功能就在于视音频的采集,网络传输两个方面,通过Video Capture系列API函数,你就可以轻松的搞定视频捕捉,但是对于视频的网络传输,则要费一番功夫了。对于视音频数据的传输,只简单地使用数据报套接字传输音视频数据是不可行的,还必须在UDP层上采用RTP(实时传输协议)和RTCP(实时传输控制协议)来改善服务质量。实时传输协议提供具有实时特征的、端到端的数据传输服务。我们在音视频数据前插入包含有载荷标识、序号、时间戳和同步源标识符的RTP包头,然后利用数据报套接字在IP网络上传输RTP包,以此改善连续重放效果和音视频同步。实时传输控制协议RTCP 用于RTP的控制,它最基本的功能是利用发送者报告和接收者报告来推断网络的服务质量,若拥塞状况严重,则改用低速率编码标准或降低数据传输比特率,以减少网络负荷,提供较好的Q.S 保证。

Directshow对于音视频的采集提供了很好的接口,利用ICaptureGraphBuilder2接口可以很轻松的建立起视频捕捉的graph图,通过枚举音频设备Filter,也可以很轻松的实现音频的捕捉,有点麻烦的是音视频数据的传输,我们可以自己封装RTP和RTCP的协议,来自己实现一个filter,用来发送和接收音视频数据,当然了Directshow也提供了一组支持使用RTP协议的网络传输多媒体流的Filters。你也完全可以用Directshow提供的RTP系列的filter 实现数据的传输。

下面分析一下这些RTP Filters。

新定义的Filter包括RTP Source Filter ,RTP Render Filter,RTP Demux Filter,RTP Receive Playload Handler (RPH) filter,RTP Send Payload (SPH) filter,使用这5个filter构建一个通过RTP协议传输音视频数据的Graph是没有问题的。

RTP Source filter被用来从一个单独的RTP会话中接收RTP和RTCP包。这个filter提供一个指定发送给其它主机RTCP接收器报告和指定网络地址和端口接口来接收RTP会话的接口。

RTP Rend filter是用来将数据发到网络上的一个filter,这个filter也提供了和RTP source Filter 类似的接口。

RTP Demux filter用来多路分离来自RTP Source filter的RTP 包,这个filter有一个或者多个输出的pin。这个Filter提供了如何控制多路分离和如何分配到特定输出pin的接口。

RTP RPH Filter 是用来网络过来的RTP包还原成原来的数据格式,主要支持H.261,H.263,Indeo,G.711,G.723和G.729和常见的多种音视频负载类型。

RTP SPH filter则和RPH filter的功能相对,它的任务是将音视频压缩filter输出的数据分解为RTP包,它提供的接口有指定最大生成包大小和pt值。

下面我们看看如何用这些filter来搭建我们采集和传输的graph图。

图1和图2展示了DirectShow RTP中定义的filters如何运用。图1是一个采集本地多媒体数据并使用RTP协议通过网络发送的filter graph。它包含一个输出原始视频帧的视频采集filter,紧跟一个压缩帧的编码filter。一旦压缩,这些帧就会被发送到RTP SPH filter,分片打包,生成RTP包,对应的发送到RTP Render filter,通过网络传输这些包。图2展现了一个filter graph,用来接收包含视频流RTP包,播放视频。这个graph由一个用来接收包的RTP Source filter,一个根据源和负载类型进行分类的RTP Demux filter,一个把RTP包转为压缩视频帧的RTP RPH filter组成。这些filter随后的是用来解压帧的解码filter,一个显示未压缩帧的渲染filter。

有了RTP filter的帮助我们就可以完成类似qq的功能了,可以实现在网络上进行视频和音频的交互了,下面我给出在网络上两个客户端A和B进行音频和视频交互的Graph图。这里我对图1和图2中的RTP filter进行了自己封装,将编解码filter直接封装到了RTP Source filter 和RTP Render filter中,这样Graph图就显得很简洁,RTP Source filter只是用来接收网络过来的音视频数据,然后将数据传递给客户程序,RTP Render filter则是将采集到的音视频数据发送到网络上的另一个客户端,编解码则的工作则封装到这两个filter之中。

图3 网络视频和音频交互的Graph图

如果你也想自己封装自己的Source 和Render filter,首先你要选择自己的编解码,视频编解码是选择H261,H263,还是MEPG4,音频是选择G729还是G711,要首先确定好。选好编解码,封装的工作就简单了。

不多说了,下面看看我给出的代码吧。

首先要定义一下用到的四个RTP filter的CLSID。

static const GUID CLSID_FG729Render = { 0x3556f7d8, 0x5b5, 0x4015, { 0xb9, 0x40, 0x65, 0xb8, 0x8, 0x94, 0xc8, 0xf9 } }; //音频发送

static const GUID CLSID_FG729Source = { 0x290bf11a, 0x93b4, 0x4662, { 0xb1, 0xa3, 0xa, 0x53, 0x51, 0xeb, 0xe5, 0x8e } };//音频接收

static const GUID CLSID_FH263Source = { 0xa0431ccf, 0x75db, 0x463e, { 0xb1, 0xcd, 0xe, 0x9d, 0xb6, 0x67, 0xba, 0x72 } };//视频接收

static const GUID CLSID_FH263Render = { 0x787969cf, 0xc1b6, 0x41c5, { 0xba, 0xa8, 0x4e, 0xff, 0xa3, 0xdb, 0xe4, 0x1f } };//视频发送

//发送和接收音视频数据的filter

CComPtr< IBaseFilter > m_pAudioRtpRender ;

CComPtr< IBaseFilter > m_pAudioRtpSource ;

CComPtr< IBaseFilter > m_pVideoRtpRender ;

CComPtr< IBaseFilter > m_pVideoRtpSource ;

char szClientA[100];

int iVideoPort = 9937;

int iAudioPort = 9938;

//构建视频的graph图,并发送数据

CComPtr< IGraphBuilder > m_pVideoGraphBuilder; //视频图形管理器

CComPtr< ICaptureGraphBuilder2 > m_pVideoCapGraphBuilder;

CComPtr< IBaseFilter > m_pFilterVideoCap;

CComPtr< IVideoWindow > m_pVideoWindow;

CComPtr< IMediaControl > m_pVideoMediaCtrl ;

CComPtr< IBaseFilter > m_pVideoRenderFilter;

HRESULT CMyDialog::VideoGraphInitAndSend()

{

HRESULT hr;

hr =m_pVideoGraphBuilder.CoCreateInstance( CLSID_FilterGraph );

if(FAILED(hr))

return hr;

hr =m_pVideoCapGraphBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder2);

if(FAILED (hr))

return hr;

m_pVideoCapGraphBuilder->SetFiltergraph(m_pVideoGraphBuilder);

m_pVideoGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pVideoMediaCtrl);

m_pVideoGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow)

FindDeviceFilter(&m_pFilterVideoCap,CLSID_VideoInputDeviceCategory);

if(m_pFilterVideoCap)

m_pVideoGraphBuilder->AddFilter( m_pFilterVideoCap,T2W("VideoCap") ) ;

//创建预览的filter

hr = m_pRenderFilterVideo.CoCreateInstance(CLSID_VideoRenderer);

if(FAILED(hr))

return hr;

m_pVideoGraphBuilder->AddFilter( m_pRenderFilterVideo, L"VideoRenderFilter" ); Connect(m_pFilterVideoCap ,m_pRenderFilterVideo) ;

//设置预览的窗口

CRect rc ;

GetClientRect(m_hOwnerWnd, &rc );

int iWidth = rc.right - rc.left ;

int iHeight = rc.bottom - rc.top ;

int iLeft, iTop;

if((iHeight*1.0)/(iWidth*1.0) >= 0.75)

{

//按宽度算

int tmpiHeight = iWidth*3/4;

iTop = (iHeight - tmpiHeight)/2;

iHeight = tmpiHeight;

iLeft = 0;

}

else

{

//按高度算

int tmpiWidth = iHeight*4/3;

iLeft = (iWidth - tmpiWidth)/2;

iWidth = tmpiWidth;

iTop = 0;

}

m_pVideoWindow->put_Owner( (OAHWND) m_hPreviewWnd ) ;

m_pVideoWindow->put_Visible( OATRUE );

m_pVideoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS ) ;

//连接到网络并发送

CComPtr< IRtpOption > pRenderOption;

CComPtr< IVideoOption > pVideoOption;

tagVideoInfo vif(160,120,24);

int t=((int)(m_iFrameRate/5)*5)+5;

vif.nBitCount=24;

vif.nWidth=160;

vif.nHeight=120;

hr = ::CoCreateInstance(CLSID_FH263Render, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&m_pVideoRtpRender);

if(FAILED(hr))

return hr;

m_pVideoRtpRender->QueryInterface(IID_IJRTPOption, (void**)&pRenderOption);

m_pVideoRtpRender->QueryInterface(IID_IVideoOption,(void**)&pVideoOption); pVideoOption->SetProperty(&vif);

pVideoOption->SetSendFrameRate(m_iFrameRate,1);//1 不发送数据,0 实际发送数据Connect(m_pFilterVideoCap ,m_pVideoRtpRender) ;

//连接对方

hr= pRenderOption->Connect(szClientA,iVideoPort,1024);

if(FAILED(hr))

return hr;

m_pVideoMediaCtrl->Run();

}

//视频的接收

CComPtr< IGraphBuilder > m_pVideoGraphBuilder; //视频图形管理器

CComPtr< IBaseFilter > m_pFilterVideoCap;

CComPtr< IVideoWindow > m_pVideoWindow;

CComPtr< IMediaControl > m_pVideoMediaCtrl ;

CComPtr< IBaseFilter > m_pVideoRenderFilter;

HWND m_hRenderWnd ;

HRESULT VideoRecive()

{

HRESULT hr;

hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,

IID_IFilterGraph,(void**)&m_pVideoGraphBuilder);

m_pVideoGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pVideoMediaCtrl);

m_pVideoGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow)

hr = ::CoCreateInstance(CLSID_FH263Source, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&m_pVideoRtpSource);

if(FAILED(hr))

return hr;

m_pVideoGraphBuilder->AddFilter(m_pVideoRtpSource, L"My Custom Source");

CComPtr< IRtpOption > m_pRtpOption;

CComPtr< IVideoOption > m_pVideoOption;

m_pVideoRtpSource->QueryInterface(IID_IJRTPOption, (void **)&m_pRtpOption);

m_pVideoRtpSource->QueryInterface(IID_IVideoOption, (void **)&m_pVideoOption);

tagVideoInfo vif(160, 120 ,24);

m_pVideoOption->SetProperty(&vif);

hr= pRenderOption->Connect(szClientA,iVideoPort +1,1024);

if(FAILED(hr))

return hr;

//创建预览的filter

hr = m_pRenderFilterVideo.CoCreateInstance(CLSID_VideoRenderer);

if(FAILED(hr))

return hr;

m_pVideoGraphBuilder->AddFilter( m_pRenderFilterVideo, L"VideoRenderFilter" ); Connect(m_pVideoRtpSource ,m_pRenderFilterVideo) ;

CRect rc ;

GetClientRect(m_hOwnerWnd, &rc );

int iWidth = rc.right - rc.left ;

int iHeight = rc.bottom - rc.top ;

int iLeft, iTop;

if((iHeight*1.0)/(iWidth*1.0) >= 0.75)

{

//按宽度算

int tmpiHeight = iWidth*3/4;

iTop = (iHeight - tmpiHeight)/2;

iHeight = tmpiHeight;

iLeft = 0;

}

else

{

//按高度算

int tmpiWidth = iHeight*4/3;

iLeft = (iWidth - tmpiWidth)/2;

iWidth = tmpiWidth;

iTop = 0;

}

m_pVideoWindow->put_Owner( (OAHWND) m_hRenderWnd ) ;

m_pVideoWindow->put_Visible( OATRUE );

m_pVideoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS ) ;

m_pVideoMediaCtrl->Run();

return S_OK;

}

//

HRESULT FindDeviceFilter(IBaseFilter ** ppSrcFilter,GUID deviceGUID)

{

HRESULT hr;

IBaseFilter * pSrc = NULL;

CComPtr pMoniker =NULL;

ULONG cFetched;

if (!ppSrcFilter)

return E_POINTER;

// Create the system device enumerator

CComPtr pDevEnum =NULL;

hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &pDevEnum);

if (FAILED(hr))

return hr;

// Create an enumerator for the video capture devices

CComPtr pClassEnum = NULL;

hr = pDevEnum->CreateClassEnumerator (deviceGUID, &pClassEnum, 0);

if (FAILED(hr))

return hr;

if (pClassEnum == NULL)

return E_FAIL;

if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))

{

hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);

if (FAILED(hr))

return hr;

}

else

return E_FAIL;

*ppSrcFilter = pSrc;

return S_OK;

}

//构建音频Graph图,并发送

CComPtr< IGraphBuilder > m_pAudioGraphBuilder; //音频图形管理器

CComPtr< ICaptureGraphBuilder2 > m_pCapAudioGraphBuilder;

CComPtr< IBaseFilter > m_pFilterAudioCap;

CComPtr< IMediaControl > m_pAudioMediaCtrl ;

HRESULT AudioGraphInit()

{

HRESULT hr;

hr =m_pAudioGraphBuilder.CoCreateInstance( CLSID_FilterGraph );

if(FAILED(hr))

return hr;

hr =m_pCapAudioGraphBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder2);

if(FAILED (hr))

return hr;

m_pAudioGraphBuilder->SetFiltergraph(m_pCapAudioGraphBuilder);

m_pAudioGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pAudioMediaCtrl);

FindDeviceFilter(&m_pFilterVideoCap,CLSID_AudioInputDeviceCategory);

if(m_pFilterAudioCap)

m_pAudioGraphBuilder->AddFilter( m_pFilterAudioCap,T2W("AudioCap") ) ;

//发送到网络

hr =::CoCreateInstance(CLSID_FG729Render,NULL,CLSCTX_INPROC,

IID_IBaseFilter,(void**)&m_pFilterRtpSendAudio)

if(FAILED(hr))

return hr;

m_pAudioGraphBuilder->AddFilter(m_pAudioRtpRender, L"FilterRtpSendAudio");

Connect(m_pFilterAudioCap,m_pAudioRtpRender);

CComPtr< IRtpOption > pOption ;

m_pAudioRtpRender->QueryInterface(IID_IJRTPOption,(void**)&pOption)

hr =pOption->Connect(szClientA,iAudioPort,1024);

if(FAILED(hr))

return hr;

m_pAudioMediaCtrl->Run();

return S_OK;

}

//音频的接收

CComPtr< IGraphBuilder > m_pAudioGraphBuilder; //音频图形管理器

CComPtr< ICaptureGraphBuilder2 > m_pCapAudioGraphBuilder;

CComPtr< IBaseFilter > m_pFilterAudioCap;

CComPtr< IMediaControl > m_pAudioMediaCtrl ;

CComPtr m_pAudioRender;

HRESULT AudioRecive()

{

HRESULT hr;

hr =m_pAudioGraphBuilder.CoCreateInstance( CLSID_FilterGraph );

if(FAILED(hr))

return hr;

m_pAudioGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pAudioMediaCtrl);

hr = m_pAudioRtpSource->CoCreateInstance(CLSID_FG729Source) ;

if(FAILED(hr))

return hr;

m_pAudioGraphBuilder->AddFilter(m_pAudioRtpSource,L"AudioRtp");

//创建声卡Renderfilter

FindDeviceFilter(&m_pAudioRender,CLSID_AudioRendererCategory);

m_pAudioGraphBuilder->AddFilter(m_pAudioRender,L"AudioRender");

CComPtr< IRtpOption > pRtpOption ;

m_pAudioRtpSource->QueryInterface(IID_IJRTPOption,(void**)&pRtpOption)

hr= pRtpOption->Connect(szClientA,iAudioPort+2,1024);

if(FAILED (hr))

return hr;

Connect(m_pAudioRtpSource,m_pAudioRender);

m_pAudioMediaCtrl->Run();

return S_OK;

}

本文来自CSDN博客,转载请标明出处:https://www.360docs.net/doc/b89255629.html,/luv_y/archive/2008/10/17/3090317.aspx

局域网聊天系统(详细设计)

局域网聊天系统 详 细 设 计 成绩:

目录 1.功能需求 (1) 2.数据库设计 (1) 2.1 基本表设计 (1) 2.1.1 表结构汇总 (1) 2.1.2 T_Users表结构设计 (2) 2.1.3 XXX表结构设计 (2) 2.2 视图设计 (2) 2.2.1 视图汇总 (2) 2.2.2 XXX视图设计 (2) 2.3 存储过程设计 (3) 2.3.1 存储过程汇总 (3) 2.3.2 XXX存储过程代码 (3) 3.服务器端设计及实现 (3) 3.1 启动服务器功能的设计与实现 (3) 3.1.1 界面设计 (3) 3.1.2 流程 (4) 3.1.3 关键代码 (4) 3.2 消息管理功能的设计与实现 (4) 3.2.1 界面设计 (3) 3.2.2 流程 (4) 3.2.3 关键代码 (4) 4.客户端的设计与实现 (5) 4.1 注册模块的设计与实现 (5) 4.1.1 界面设计 (5) 4.1.2 流程图 (6) 4.1.3 关键代码 (6) 4.2 登陆功能的设计与实现 (6) 4.2.1 界面设计 (5) 4.2.2 流程图 (5) 4.2.3 关键代码 (6) 4.3 聊天功能的设计与实现 (7) 4.3.1 界面设计 (8) 4.3.2 流程图 (8) 4.3.3 关键代码 (9) 5.人员及分工 (9)

局域网聊天系统 详细设计1.功能需求 图 1 项目功能结构图2.数据库设计 2.1 基本表设计 2.1.1 表结构汇总 表 1 基本表汇总

2.1.2 T_Users表结构设计 表 2 用户表(T_Users)结构设计 2.1.3 XXX表结构设计 表 3 XXX(xxx)结构设计 2.2 视图设计 2.2.1 视图汇总 2.2.2 XXX视图设计

基于MFC的聊天程序设计

聊天程序设计报告 ----网络编程设计报告 目录 【1】设计原理————————————————————————1 【2】功能描述————————————————————————1 【3】详细设计————————————————————————2 【4】工作进度————————————————————————7 【5】设计总结————————————————————————8 【6】使用方法————————————————————————9 【7】附录——————————————————————————9 一. 设计原理 计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、中国移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。 此程序主要分为两个模块:服务线程和聊天线程。服务线程用于提供一个网络端口,等待客户线程发出请求,登录到作为服务端的程序,然后进行网络通讯和消息的收发;客户端可通过服务器端的IP地址发送连接请求,然后建立连接,进行通讯。整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。 二.功能描述(需求分析) 1、一对一会话。此程序既可以作为服务器,也可以作为客户端。当发起聊天请求时是客户端,而当接受连接请求时时服务器。通讯基于可靠的TCP连接。

DirectShow之接口实战篇

在正确安装好DirectX SDK后,我们必须设置DirectX SDK的头文件和库文件,使其在Visual Studio的搜索路径内。对于Visual Studio .NET 2003可如下进行设置:菜单→工具→选项→项目→VC++目录,在包含文件中加入D:\DXSDK\Include,在库文件中加入 D:\DXSDK\lib(我的SDK的安装路径是D:\DXSDK): 头文件 文件名称描述 Dshow.h所有的DirectShow应用都必须包含库文件 文件名称描述 Strmiids.lib此库文件中导出类标识(CLSID)和接口标识 (IID),所有的DirectShow应用都必须包含此 文件。 Quartz.lib此库文件中导出函数AMGetErrorText,如果 你的程序中调用了此函数,则必须包含此库 文件。 DirectShow之接口实战篇(一) 现今自己编程做一个多媒体播放工具是一件很令人开心愉悦的事情,但如果使用MediaPlay 控件开发则会受到很多限制,自己的很多好的创意想法都无法或者很难实现,如果利用微软的DirectX接口开发则可以充分的将作者的独特想法付诸于实现,何乐而不为呢!!不过关于DirectShow接口的开发说明文档实在是少之又少,仅有的一些不是英文的就是一些关于理论方面的,真正关于接口实战编程而且是用Delphi开发工具实现的更是凤毛麟角,使很多人都望而却步。在这里,我把我应用Directshow开发的心得以及我搜集到一些资料重新整理编辑出来公布,希望对所有由此兴趣的同仁有所帮助,就算达到了我的目的。废话少说,进入正文。 既然是接口实战篇,就先把一些常用的接口列出来,让大家有一些基本的认识,都是用来做什么的,什么时候我们会需要用到此接口。 IFilterGraph 过滤通道接口 IFilterGraph2 增强的IFilterGraph IGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager IMediaControl 用来控制流媒体,例如流的启动和停止暂停等,播放控制接口 IMediaEvent 播放事件接口,该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序 IMediaEventEx 扩展播放事件接口 IMediaPosition 播放的位置和速度控制接口(控制播放位置只能为设置时间控制方式) IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强.设置播放格式,多种控制播放方式.常用的有:(1)TIME_FORMAT_MEDIA_TIME单位100纳秒。(2)TIME_FORMAT_FRAME按帧播放 IBasicAudio 声音控制接口

基于.NET局域网聊天工具设计

基于.NET局域网聊天工具设计 学校: 系:计算机系 专业:小学教育计算机双语 姓名: 完成时间:2012年5月28日

设计(论文)题目: 基于.NET局域网聊天工具设计 设计(论文)要求: 本设计的主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,具体是采用C\S模式实现用户之间的通信,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。 局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具,一般都具有文本聊天和文件传输功能。局域网聊天软件因其使用简单,系统资源消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。

中文摘要: 随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET。因此基于局域网的即时通信工具,就这样应运而生了。本文提出了一个局域网聊天工具的设计,并在WINDOWS平台上加以了实现。本设计将文本聊天和文件传输等功能综合在一个客户端程序之内,使用C#语言进行网络编程,并进行了人性化的界面设计,使用起来简单方便,并且功能十分合理,又易于扩展以及个性化定制。 关键词:局域网;C/S体系结构;文本聊天;文件传输 英文摘要: Abstract:Along with the high-speed development of the computer network technology, various of applications which are based on network were born, such as Internet-based information releasing,communications,data sharing and so on. The development of LAN is the same fast. Because of Some government institutions, enterprises and schools constitute a LAN first ,then join into INTERNET, the real-time LAN-based communication tools emerged. this paper proposed a LAN chat tool designing, and then implement it on WINDOWS platform. The design integrated text-chat and file-transfer and other functions in a client procedure. It used C # language for network programming with designed a user-friendly and easy to use interface , and it's functions are reasonable and easy to extend, as well as customization. Key words: LAN; C/S Architecture ;text-chat; file-transfer;

利用DirectShow开发自己的filter

学习directshow已经有几天了,下面将自己的学习心得写下来,希望对其他的人有帮助。Filter实质是个COM组件,所以学习开发Filter之前你应该对com的知识有点了解。Com组件的实质是一个实现了纯虚指针接口的C++对象。关于com的东西,这里不多讲。 一给vc配置DirectShow的开发环境 无论开发Filter还是开发Dshow的应用程序都要配置一下开发环境的,其实就是包含一下dshow用到的头文件和动态库。选择Tools菜单下面的Options。在弹出的Option对话框配置如下 图1 添加头文件 选择动态库文件添加到工程中

图2 添加动态库 二创建工程以及Filter的入口函数 创建工程 一般情况下,创建Filter使用一个普通的Win32 DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例;Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。 在vc里新建一个工程,选择win32动态库,如下图 图3 图4

这样生成了一个简单的DLL,只有一个Dllmain入口函数。 下面我要给这个filter添加入口函数了。 Filter是个基于DLL的com组件,所以一般的Filter都要实现下面几个入口函数 首先定义导出函数 要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。使用导出函数关键字_declspec(dllexport)创建MyDll.dll就是在 .h文件中定义定义函数如下: 为了用.def文件创建DLL,往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码: LIBRARY MyFilter.ax EXPORTS DllMain PRIVATE DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE 其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。 然后要定义这些函数的实现了,其实这些工作dshow的基类里都已经替我们做好了,我们所要做的就拿来用就是了,最重要的三个函数的实现一般如下

简单的tcp一对一,一对多通信

课程实验报告 课程名称:C#网络编程 实验项目名称:实验三窗体TCP通信 专业班级:B11522 姓名: 学号:201320120 指导教师: 完成时间:2014 年 3 月24 日 计算机科学与工程系

实验三窗体TCP通信 一、实验目的 1、掌握SOKCET面向连接通信的基本原理; 2、掌握窗体程序下套接字通信程序中服务器端的通信流程; 3、掌握窗体程序下套接字通信程序中客户端的通信流程; 二、实验内容 1. 完善控制台程序,实现一对多服务器端和客户端的程序代码,其中服务器只需接收多个客户端的信息,无需给每一个客户端发送回复。 2. 实现窗体程序下tcp通信中,服务器端和客户端的通信程序,实现一对一多次通信。 3. 尝试服务器能和多个客户端通信,并行模式(服务器可以同时和多个客户端进行收发信息的通信),提示:服务器端程序每来一客户端连接请求,需要打开一个新的窗口来实现和客户端的通信。(此部分内容,实验报告上可以不体现) 三、实验过程 第一题: 服务器端代码: namespace server_more { class Program { private static byte[] result = new byte[1024]; private static int myprot = 8889; static Socket serverSocket; static void Main(string[] args) { IPAddress ip = IPAddress.Parse("127.0.0.1"); serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myprot)); serverSocket.Listen(10); Console.WriteLine("启动监听成功|", serverSocket.LocalEndPoint.ToString()); Thread myThred = new Thread(ListenClientConnect);

国内几款比较好用的局域网沟通工具

国内几款比较好用的局域网沟通工具 导读:我根据大家的需要整理了一份关于《国内几款比较好用的局域网沟通工具》的内容,具体内容:局域网聊天软件,简称LCS,它是一种面向企业局域网终端使用者的网络沟通工具服务,使用者可以通过安装了即时通信的终端机进行两人或多人之间的实时沟通。下面是我收集整理的,希望对大家有帮助~... 局域网聊天软件,简称LCS,它是一种面向企业局域网终端使用者的网络沟通工具服务,使用者可以通过安装了即时通信的终端机进行两人或多人之间的实时沟通。下面是我收集整理的,希望对大家有帮助~~ 工具/原料 电脑 局域网 方法/步骤 TOP 1 imo内网通 Imo内网通是一款完全免费局域网办公沟通软件。快捷方便是软件的最大特点,自动扫描在线用户,无需安装和配置各类打印机驱动程序,即刻实现客户端文件互传、远程播放和打印功能,成为企业、政府办公和家庭多媒体共享的有力工具。 而且基于内网,安全、可控。它将聊天信息全部留在用户本机,不经过互联网和服务器,不受监控,并对聊天信息通过AES技术进行加密,从源头上保证了用户的信息安全。完全兼容网上广为流传的飞鸽传书并比原来

飞鸽功能更加强大. 很多朋友钟爱imo内网通,不仅是因为内网通避免了私人信息对工作干扰,更因为内网通的即时通讯、话题讨论、时间管理等功能,使企业内部的沟通能有效传达,让有限的时间更加专注于工作。大幅提高工作效率。功能性:★★★★☆ 性价比:★★★(完全免费) 推荐指数:★★★★★ TOP 2 飞秋 飞秋(FeiQ)是一款局域网管理软件/局域网聊天软件的绿色软件,它参考了飞鸽传书(IPMSG)和QQ, 完全兼容飞鸽传书(IPMSG)协议,具有局域网传送方便,速度快,操作简单的优点,同时具有QQ中的一些功能,是飞鸽的完善代替者。 但是很遗憾的是,由于互联网的快速发展,人们的眼光早已从局域网转向了更加广阔的全球化互联网领域。大量的软件开发人员都投身到了互联网浪潮之中,而局域网这样的"小池塘",渐渐被一些开发人员所忽略。飞秋宣布停止更新后、市场上仅仅剩下imo内网通等为数不多几家仍然坚持提供局域网沟通服务。 功能性:★★★★★ 性价比:★★☆ 推荐指数:★★★★ TOP 3 飞鸽传书 飞鸽传书是一款局域网内部聊天、文件传输工具,在程序结构方面采

实现DirectShow技术开发准备

C#实现DirectShow技术开发准备 时间:2009-10-21 23:45 点击:73次字体:[大中小] DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。在转换过程中需要使用FrameWork SDK自带的TlbImp命令工具,该命令工具在“D:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe”目录下(取决于Visual Studio 2005的安装路径)。该命令的使用方法为: TlbImp C:WINDOWSsystem32quartz.dll out:C:WINDOWSsystem32quartzDriectShow.dll 在DOS命令下执行转换成功。 转换完成后需在应用程序引用quartzDriectShow,引用quartzDriectShow.dll组件步骤如下: (1)在Visual Studio 2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。 (2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中来。 (3)最后引入using quartzDriectShow,在程序中可以开发相关多媒体程序了。 开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。下面是DirectShow组件的接口。 l IFilterGraph:过滤通道接口。 l IFilterGraph2:增强的IfilterGraph。 l IGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager。 l IMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。 l IMediaEvent:播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序。 l IMediaEventEx:扩展播放事件窗口。 l IMediaPosition:播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)。 l IMediaSeeking:另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放。 l IBasicAudio:声音控制接口。

局域网聊天软件

通信软件设计三级项目任务书 一、题目:局域网聊天软件分析 二、班级: 三、小组成员: 四、起止时间:第六学期第十六周2012-6-4~2012-6-9 五、设计要求与思路: 通过Ethereal抓包,认真分析飞秋的工作原理、实现方法和工作协议等,并仿照飞秋、设计实现一个简单的局域网聊天软件,尽量能够做到与飞秋兼容。 设计思路:先使用飞秋,熟悉飞秋的功能;深入分析每一部分的功能实现;通过防火墙观察飞秋使用的套接字情况,并抓包分析飞秋在使用过程中的网络数据传输,分析飞秋的应用协议,分析设计实现简单的聊天软件,实现好友列表维护和文本消息传送等功能。 六、主要任务: 1、深入理解TCP和UDP的工作原理和服务的特性,掌握套接字编程机制和方法; 2、理解C/S架构和P2P两种应用模式; 3、深入分析飞秋的功能、工作原理、应用协议等; 4、完成局域网聊天软件的分析、开发与调试; 5、在设计报告中对飞秋进行全面和深入的剖析; 6、按照格式要求撰写设计报告。 学生(签字): 指导教师(签字): 系主任(签字):院长(签字):

1、设计要求与任务 通过Ethereal抓包,认真分析飞秋的工作原理、实现方法和工作协议等,并仿照飞秋、设计实现一个简单的局域网聊天软件,尽量能够做到与飞秋兼容。 先使用飞秋,熟悉飞秋的功能;深入分析每一部分的功能实现;通过防火墙观察飞秋使用的套接字情况,并抓包分析飞秋在使用过程中的网络数据传输,分析飞秋的应用协议,分析设计实现简单的聊天软件,实现好友列表维护和文本消息传送等功能。主要任务:深入理解TCP和UDP的工作原理和服务的特性,掌握套接字编程机制和方法;理解C/S架构和P2P两种应用模式;深入分析飞秋的功能、工作原理、应用协议等;完成局域网聊天软件的分析、开发与调试;在设计报告中对飞秋进行全面和深入的剖析。 2、设计正文 2.1、飞秋分析 飞秋是一款局域网聊天传送文件的绿色软件,它参考了飞鸽传书(IPMSG)和QQ, 完全兼容飞鸽传书(IPMSG)协议,具有局域网传送方便,速度快,操作简单的优点,同时具有QQ中的一些功能,是飞鸽的完善代替者,另外,飞秋支持语音,远程协助群聊天(不需要服务器),它参考了飞鸽传书(FreeEIM)和QQ, 完全兼容飞鸽传书协议,具有局域网传送方便,速度快,操作简单的优点,同时具有QQ中的一些功能。 2.1.1、飞秋的工作原理 上线通知:对于飞秋而言,最关键的是局域网用户列表的建立;飞秋启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,默认端口是2425。广播包内容包含用户名、工作组、主机名、IP等信息;已启动飞秋的用户通过2425端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表。 聊天过程:飞秋在刷新用户列表时发送的广播包和启动时差不多,只不过返回的标识信息略有不同;可以做一个小工具,监控2425端口内存流,就能截获刷新和聊天时的消息。飞秋在传送聊天信息时同样使用UDP协议;由于UDP协议是无连接协议,传输速度快,但是没有确认机制,是不可靠的协议,需要自己定义返回信息的标志来判断对方是否收到信息。 离线通知:用户离线时发送一个离线广播包到255.255.255.255,收到此广播包的用户,根据包中的IP地址(也可能是多种判断标志或者包含硬件标识,比如网卡地址等)删除对方的用户列表信息;

实现一对一聊天程序

实现一个一对一的聊天程序 一实习题目 实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。 二原理概述 本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。重点是流式套接字对象的使用,处理网络事件的方法。本此课程设计是利用网络聊天程序的基本设计思想,并按照网络通信的协议设计出来的一个基于UDP 的网络聊天程序。端口号拼接到IP地址即构成了套接字(socket)。套接字(socket)=(IP地址:端口号)。在网络编程时常常把套接字作为应用进程和运输层协议之间的接口。当应用进程(客户或服务器)需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个“套接字”。这个调用的实际效果是请求操作系统把网络通信所需要的一些资源分配给该应用进程。操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,然后把这个套接字描述符返回给应用进程。此后,应用进程所进行的网络操作都必须使用这个套接字描述符。 三设计方案 1 问题分析: 本次计算机网络与通信实习的任务是设计一个一对一的聊天程序。根据课程设计要求程序采用客户/服务器模式,分为客户端程序和服务器端程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。重点是流式套接字对象的使用,处理网络事件的方法。 2 设计思路: 程序采用VB语言编写,运用UDP面向无连接数据报协议完成实验,程序的核心是运用的空间为VB网络编程中的Winsock控件。数据之前不必建立连接,只需要将Winsock绑定到一个端口上,其他无连接协议的Winsock若想向此处发送数据,需要指明地址和端口。 (1)将RemoteHost 属性设置为另一台计算机的名称或者IP地址。 (2)将RemotePort 属性设置为另一台计算机Winsock控件所绑定的LocalPort 属性。 (3)调用Bind 方法,指定使用的LocalPort。 3 系统模块结构: 根据程序设计要求,设计出整个网络聊天程序的设计框图。

好用局域网管理软件有哪些

1、聚生网管局域网上网管理软件 聚生网管是国内最早的专业上网行为管理软件之一,专业管理公司局域网员工上网行为,有效控制员工上班时间的网购、聊天、炒股、玩游戏、看网络电视,并且还可以控制局域网网络流量、限制局域网网速,实现局域网网络资源的均衡、合理和高效分配。 2、小孩电脑上网管理软件 针对儿童上网,家长也可通过局域网管理软件实时监控。查找指定扫描范围的主机上开放服务的所有端口;检测同一网段上所有电脑数据流。对于IP数据,解析出具体的数据流信息内容。如在系统配置中选择;保存监测内容,则在mytool.exe同目录下产生log.txt,保存监测的数据流内容。;检测指定IP地址的电脑的数据流。对于IP数据,解析出具体的数据流信息内容。如在系统配置中选择;保存监测内容,则在mytool.exe同目录下产生log.txt,保存监测的数据流内容;Ping指定扫描范围所有主机,检测主机是否已开机;显示本机的IP、以及本机在注册表中的主机名;检测同一网段上数据流中包含的影音文件地址。包括swf,rm,ram,asf,mov,mpg,mpeg,mp4,flv,wmv,avi十一种主流视频格式。如在系统配置中选择保存影音内容,则在mytool.exe同目录下产生yinglog.txt,保存检测到的影音文件地址链接;检测同一网段上数据流中包含的QQ号码,以及QQ行为。 3、限制员工上网软件 局域网管理限制员工上网软件(FocalFilter)是一款可以限制小孩和员工上网的软件,限制员工上网软件这款工具可以设置制定的网站都网页无法访问,是采用修改host的原理,任何浏览器都无法突破~有需要的朋友可以下载使用。 4、小草网管局域网管理软件 小草网管局域网管理软件可综合智能动态带宽保障,服务器流量分析与保障、虚拟多设备管理及多项突破性技术,涵盖流量分析、带宽管理、上网行为管理、dmz区服务器管理,专线集中管理、企业级防火墙与路由器、负载均衡等功能,在网络性能、质量、安全等方面为客户提供完整的解决方案。本产品已获得各行业客户的广泛认可,成为企业网关综合管理软件产品第一品牌。 5、向日葵绿色远程监控软件 向日葵远程控制是一款远程控制的绿色软件。向日葵绿色远程监控软件是一款面向企业和专业人员的远程PC管理和控制的服务软件。在任何连入互联网地点,可轻松访问控制向日葵远程被控制客户端的远程主机,整个过程只需通过浏览器进行,无需再安装软件。 好用局域网管理软件有哪些?上网控制软件推荐就为大家介绍到这里 注:更多精彩教程请关注三联电脑教程栏目,三联电脑办公群:189034526欢迎你的加入

c++MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊

c++/MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊 分类:c++ 2012-11-25 16:45 1582人阅读评论(13) 收藏举报c++C++mfcMFCqqQQsocket聊天 学习,c++有2个星期了。本来,本人是做php出身的。做php快2年了,最近身边多了很多高手。让自己对c开始感兴趣了,就开始学习c++了。首先接触的就是mfc。前几天,看到了一个博文,是有关,mfc网络编程的。可对方,的实例只能是多对多,出于兴趣,自己改写了下它的程序,实现了点对点的聊天。所以,本实例并非纯原创的。这个还请大家见谅,尤其是作者。我在他程序基础上,增加了1对1的聊天,同时还保留了群聊。而且,最关键的是,我增加了很多备注。很适合新手学习。。。本人也是新手,还请各位高手提出宝贵建议。。。先谢谢大家了。 如果要转载请注明原地址:https://www.360docs.net/doc/b89255629.html,/open520yin/article/details/8222279 实例下载地址:https://www.360docs.net/doc/b89255629.html,/detail/open520yin/4808903(为了自己能有点下载积分,客户端和服务端一起打包5个积分不算贵吧。。呵呵。。。) 大家要是想看懂这个可能还需要先了解一下mfc的socket的一些基本使用规则我也有一篇博文写了 c++/MFC 极为简单的socket实例:https://www.360docs.net/doc/b89255629.html,/open520yin/article/details/8202465 MFC的CSocket编程,利用CSocket实现一个基于TCP实现一个QQ聊天程序。 ///////////////////////////////////////////////////////////////////////// 服务端 start /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 先讲讲服务端,一切先从服务端开始: 首先就是要使用AfxSocketInit初始化winsocket, [cpp]view plaincopyprint? 1. //初始化winSock库,成功则返回非0否则返回0 2. WSAData wsData; 3. if(!AfxSocketInit(&wsData)) 4. { 5. AfxMessageBox(_T("Socket 库初始化出错!")); 6. return false; 7. } m_iSocket 是一个CServerSocket*的指针 ,CServerSocket类是一个我们自己的类我会在后面给出相应代码,他继承于CSocket类。 [cpp]view plaincopyprint? 1. //创建服务器端Socket、采用TCP 2. m_iSocket = new CServerSocket(); 3. if(!m_iSocket) 4. { 5. AfxMessageBox(_T("动态创建服务器套接字出错!")); 6. return false; 7. }

基于DirectShow视频及图片捕获软件的开发

基于DirectShow视频及图片捕获软件的开发 我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。 笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。下面是软件的主界面。 预览视频后可以对视频格式和图像参数进行设置。开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。

下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。 另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。 从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。我们将逐步开放我们的源代码,以便更多的同行一起来探讨相机的图像采集技术。 下面是详细的软件开发过程。 一、安装DirectShow和visual studio 2005 首先我们安装DirectShow SDK,它有许多版本,作者使用的是2003年发布的dx90bsdk.exe,安装在D盘的DXSDK下。软件下载地址为 https://www.360docs.net/doc/b89255629.html,/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe。 然后安装好visual studio 2005。安装完以后我们将进行开发环境的配置。 二、开发环境配置

最新局域网聊天软件需求分析

软件需求分析 —CLASSROOM局域网聊天一、引言 二十一世纪是信息时代,作为信息时代主要标志的计算机,尤其是个人计算机得到了大量普及。在这同时,人们对通过计算机进行聊天、视频、传送资料等功能的需求随之大增。而局域网聊天软件因其方便、安全,逐渐被人重视,相应的聊天软件也如雨后春笋应运而生。我们设计的软件是以JAVA语言为实现语言,期为用户提供一个界面友好、功能丰富、操作简单的局域网聊天软件。 1.1目的 本需求编写的目的在于探求局域网的开发途径和应用方法。 本需求的预期读者是软件设计人员、测试人员以及最后的验收该软件的管理人员等。 1.2背景 本项目的名称:CLASSROOM局域网聊天软件 本项目的开发者:第八软件工程开发小组 在该软件开发之前已经有大量的局域网聊天软件,其中使用比较广泛,功能比较强大的同类型软件有QQ、企业即时通讯软件Active messenger、布谷鸟、飞鸽传书、MSN、飞秋等。本项目致力于开发出一款简便、实用、美观且免费的局域网聊天软件,方便广大的局域网聊天爱好者下载和使用。 1.3参考资料 [1]《信息系统分析与设计》卫春红方明著西安电子科技大学出版社 [2]《软件工程导论》张海藩著清华大学出版社 [3]《实用软件工程》清华大学出版社 1.4术语 [1]局域网聊天软件:简称LCS(LAN chat software),它是一种面向企业局域网终端使用者的网络沟通工具服务,使用者可以通过安装了即时通信的终端机进行两人或多人之间的实时沟通。交流内容包括文字、界面、语音视频及文件互发等。 二、任务概述

2.1目标 2.1.1开发意图 a.为局域网聊天爱好者提供一个可供选择的聊天软件; b.通过软件开发,熟悉软件开发的整体流程,提高编程能力,培养合作意识; 2.1.2应用目标 通过本软件,方便用户在局域网内进行聊天,收发文本等活动。 2.1.3作用及范围 本软件提供简单、实用的聊天功能,所有的局域网聊天爱好者均可免费使用。 2.1.4背景 现今的局域网聊天软件大多功能复杂,操作繁琐,为了给局域网用户提供一个简单实用的聊天工具,我们开发了该软件。 2.2系统的特点 该软件与其他的局域网聊天软件相比有以下几个特点: (1)界面美观,人机互动较好; (2)占用的内存较小,不会对用户其它软件的使用造成影响; (3)免费提供给用户,容易下载。 三、假定和约束 3.1技术约束 该软件是以JAVA高级语言为实现语言,在eclipse编译器上进行设计、编程、测试软件。 3.2标准约束 该软件的开发完全按照软件开发的标准程序,包括硬件、软件和文档规格。 3.3时间限制 所有的软件开发包括可行性分析、需求分析、规格说明等文档,以及可运行的程序必须在十八周之前完成。 四、需求规定

基于TCP的简单一对一聊天程序设计

基于TCP的简单一对一聊天程序设计 一、课程设计目的 1、通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型 2、培养学生分析、解决问题的能力,提高学生动手能力。 3、使学生掌握搜集资料、调查研究、整理报告的方法。 4、初步掌握网络应用程序开发技术以及互联网的应用技术。 二、课程设计的要求及原理 1、课程设计要求。实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套节字等待客户连接;客户启动以后,创建套届字,然后和服务器建立连接;连接建立以后,客户机和服务器可以通过建立的套节字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以使分别部署在两台电脑上。 2、课程设计原理。 客户服务器模型。它是指客户/服务器模型是所有网络应用的基础。客户/服务器分别指参与一次通信的两个应用实体,客户方主动地发起通信请求,服务器方被动地等待通信的建立。它是一个在建立分布式应用时最常用的范例。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议

中,一方被不可改变地认为是主机,而另一方则是从机。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"客户进程"和"服务进程"。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。 相关协议。应用到的网络协议主要有TCP协议。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。 三、设计方案 首先本程序的定位是一对一的聊天程序;程序没有采用图形界面;程序的设计语言采用的是C++;基于winsock;开发工具为VC++。 聊天程序的设计可以采用UDP或者TCP,程序采用TCP。采用的是客户服务器模型。在本程序中,一个用户作为Server端,另一个用户作为Client端。也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。Client端自动建立连接请求。当TCP连接握手以后,双方方可进行交互。

DirectShow获取一张图片

DirectShow:图片的抓取 zz 在播放媒体文件的过程中,有一个很有用的功能,就是在当前播放的位置抓取图,实现这种图片抓取功能的方法很多,我们这里只介绍常用的两种。 第1种方法最简单,它使用1BasicVideo::GetCurrentImage接口方法,代码如下。 boolSnapshotBitmap(IBasicVideo*pBa8icVideo,ê? constchar*OutFile) if (pBasicVldeo) { long bitmapSize=0;ê? //首先获得图像大小 if(SUCCEEDED(pEasicVidee->GetcurrentImage(&bitmapSize,ê?0))) { bool pass=false;ê? //分¤?配?图a?像?帧?内¨2存?? unsignedchar*buffer=newunsignedchar[bitmapSize]; //获?取¨?图a?像?帧?数oy据Y if(SUCCEEDED(pBasicVideo->GetCurrentImage(&bitmapSize,(long*)buffer)) ) { BITMAPFILEHEADER hdr;ê? LPBITMAPINFOHEADER ipbi;ê? ipbi=(LPBITMAPINFOHEADER)buffer;ê? int nColors=1<biBitCount;ê? if(nColors>256) //always is”?àBM”?à hdr.bfType =((WORD)(‘?M’?¥<<8)|’?¥B’?¥);ê? hdr.ê?bfSize =bitmapSize+sizeof(hdr);ê? hdr.ê?bfReservedl =0; hdr.ê?bfReserved2 =0;ê? hdr.ê?bfOffBits =(DWORD) (sizeof(BITMAPFILEHEADER)+lpbi->biSize+nColors*sizeof(RGBQUAD)); CFilebitmapFile(outFile,ê?CFile:êo:êomodeReadWrite | CFile:êo:êomodeCreate | CFile:êo:êotypeBinary);ê? //写??入¨?位?图a?文?件t头a?¤ bitmapFile.ê?Write{&hdr,ê?sizeof 【?BITMApFILEHEADER)); //写??入¨?图a?像?帧?数oy据Y(包?¨1括¤?§BITMAPINFOHEADER信?息?é) bitmapFile.ê?Write(buffer,ê?bitmapSize);ê? bitmapFile.ê?Close();ê?

相关文档
最新文档