目录
系统设计
系统总体设计
3.1.1运行环境
操作系统:Windows2000/XP/2003 等
安装JDK
安装JMF
安装eclipse
安装摄像头
3.1.2系统流程
服务器端流程如图3.1所示:
客户端流程如图3.2 所示:
3.1.3系统结构
通过学习和研究,我们通过多播技术实现了多点对多点的视频会议系统。整个系统包括这样几个模块:
文本聊天模块:该功能是网络视频会议的最基本的功能。通过该模块实现了会议成员的聊天通信。首先,每个会议职员通过与服务器连接加入到会议组,同时通过给自己取昵称将自己的昵称发送给服务器,让会议组的每个成员了解自己的身份。会议成员在聊天的时候不是将文本发送给某个人,而是发送给整个会议组。
视频通信模块:该功能利用JMF软件开发包,基于RTP协议实时发送和接受视频流。并且利用JMF多媒体组件构造播放器,进行实时播放。在实现了点对点的基本视频传输的基础上,我们应用了多播技术。当某个会议成员开始进行视频连接以后,他能通过视频会议系统看到所有其他已经建立视频连接会议成员。
3.2 系统接口的概要设计
3.2.1服务器端设计
系统的服务器端的设计只需显示在线的用户,简单设计图示如下:
3.2.2客户端设计
系统客户端的设计如下:
1. 显示在线列表;
2. 显示界面中用户视频;
3. 用户聊天文本框;
4. 视频连接及退出按钮。
简单设计图示如下:
3.3 系统出错处理设计
3.3.1出错信息及处理方法
系统输出信息的形式、含意及处理方法。见表3.1。
表3.1 出错信息及处理方法
故障情况 | 系统提示信息内容与形式 | 处理方法 |
开启服务器失败 | 提示失败信息“开启服务器失败,请重试” 弹出对话框 | 重新开启服务器 |
登录失败 | 提示失败信息“登录失败,请重试” 弹出对话框 | 重新登录 |
连接视频失败 | 提示失败信息“视频连接失败” 弹出对话框 | 重新连接视频 |
3.3.2系统维护设计
为了保证系统的稳定运行,本系统在设计时考虑到了系统的安全性、可靠性、兼容性、可扩展性等因素。了很多验证条件,尽量保证信息的合法性与正确性,是系统能够稳定运行。此外本系统的设计还保证了系统功能的可扩展性。
安全性:在视频会议系统前端安置加密机或者直接使用加密网卡可以提高在传输过程中的安全性。加密设备可直接提供加密能力,从而实现用户的身份验证以及未经授权的数据访问和恶意侵犯。
可靠性:该系统设计的合理性保证了可靠稳定的运行,支持当前大多数硬件平台,核心线程优先保护、数据流容错的设计思路使系统可更加稳定的运转。
兼容性:该系统拥有开放的集成接口,可以非常灵活的与用户集成,并满足用户的需要,实现其功能。
可扩展性:该系统可进行再扩展,在此基础上扩展为一点对多点,多点对多点的视频会议系统。
系统实现1用户登录模块
5.1 系统开发环境
系统:Microsoft Windows XP Professional Service Pack 2
开发语言:JAVA
编程环境:Eclipse
JMF版本:JMF 2.1.1
JDK版本:JDK 5.0
Eclipse版本:Eclipse3.2
5.2 系统实现
5.2.1服务器端套接字建立
数据通讯是双向的,客户端通过套接字请求数据通讯后,服务器端需要有一个响应客户端请求通讯的服务程序,该服务器程序应用ServerSocket类完成与客户端的通讯。
ServerSocket类用来监听和响应客户端的连接请求,并接受客户端发送的数据信息。ServerSocket类在服务器端等待其他机器同它的连接,一旦客户端程序建立一个套接字连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端套接字对象,以便进行直接通讯。从两台计算机连接成功起,服务器端与客户端就得到了一个真正的“套接字-套接字”连接,此时利用Socket类中的getInputStream()及getOutputStream()方法从每端的套接字产生对应的InputStream和OutputStream对象,并将套接字数据流封装到缓冲区内以便进行两台机器之间的数据通讯。
serverSocketChannel =ServerSocketChannel.open();//打开连接通道
serverSocketChannel.socket().bind(newInetSocketAddress(12345));
//绑定IP与端口号
getConnection();//接收连接请求
charSet =Charset.forName("UTF-8");//开启服务器套接字通道
serverSocketChannel =ServerSocketChannel.open();
serverSocketChannel.socket().bind(newInetSocketAddress(12345)); serverSocketChannel.configureBlocking(false);
//设置阻塞模式为非阻塞模式等待一个连接
5.2.2客户端套接字建立
客户端使用Socket类的方法建立(类似于服务器端),客户端向套接字对象中的数据流输出和获取数据。客户端程序试图与服务器之间在Socket层次上建立一个连接,通过套接字输入流读取方法从套接字数据流中获取服务器信息,以及写入数据到套接字输出流中向服务器发送信息,并且等待服务器的答复。如果连接成功,则该客户端程序通过套接字与服务器可以进行正常的数据交换。
socketChannel =SocketChannel.open();打开连接通道
socketChannel.connect(new InetSocketAddress(InetAddress.getByName
(serverAddress),12345));//连接到服务器
receiveMessage = new ReceivingThread();//构造接收信息线程
receiveMessage.start();//运行线程
socketChannel.write(writeBuffer);//往通道里写入消息
socketChannel.read(readBuffer);//读取通道中消息
5.2.3视音频发送
视音频数据以RTP实时流的形式发送出去,通过会话管理器(Session Manager)传输RTP数据的步骤为:
1. 产生一个JMF处理器(Processor),为每一种RTP格式设置相应的轨迹格式。
2. 从处理器获取输出数据源。
3. 会话管理器产生一个发送数据流,即以数据源和序号作为参数调用会话管理器的createSendStream()方法。
4. 开始会话传输。
5. 通过监听ControllerEvent事件控制会话的过程。
6. 停止会话,删除会话管理器。
定义以下内容:
// 媒体定位 IP 端口 处理器 会话管理器 输出数据源
private MediaLocator Locator;
private String IpAddress;
private int portBase;
private Processor processor=null;
private RTPManger rtpMgrs[];
private DataSource dataOutput=null;
具体实现函数如下:
//发送数据函数
public RTPTransmit(Processorprocessor,String ipAddress, String pb){}
//为媒体定位器产生一个处理器
private String createProcessor(){}
// 为处理器的每一个媒体磁道产生一个RTP会话
private String createTransmitter() {}
// 让处理器开始传输
public synchronized String start(){}
// 停止传输
publicvoid stop(){}
//组播线程类
classCreateJoinMuiltcastThread extends Thread {}
//处理器的状态监听器类
class StateListener implements ControllerListener {}
5.2.4视音频接收
接收网络实时媒体数据流是通过java.media包中定义的各种RTP事件监听器和RTP事件处理类来处理和控制的,使用java.media包中的Player类可以实时播放网络多媒体数据流,java.media包中的处理媒体流接收和播放完成了整个接收RTP数据的过程。接收部分程序为每一种新接收到的媒体数据流产生一个播放器,一边接收媒体流数据,一边将媒体数据播放出来,其实现分为以下几个步骤:
1. 实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。
2. 当接收到NewReceiveStreamEvent事件后,通过事件获取接收媒体数据流(ReceiveStream),然后通过接收媒体数据流获取RTP数据源(DataSource)。
3. 将数据源传给Manager.createPlayer()产生一个播放器。
4. 给播放器添加监听器,等到播放器实现后,即可显示播放数据。
定义以下内容:
String sessions[] = null; // RTP会话字符串数组
RTPManager mgrs[] = null; // RTP管理器数组
Vector playerPanels = null; // 管理播放器窗口的向量
boolean dataReceived = false; // 是否接收到数据的标志
Object dataSync = new Object(); // 同步对象
具体实现函数如下:
//接收数据实现函数
public Receive(String sessions[]) {}
//初始化RTP会话,准备接收数据
protected boolean initialize(){}
//关闭播放窗口
protected void close(){}
//判断数据是否接收完成
public boolean isDone() {}
// 通过播放器查找播放窗口
PlayerPanel find(Player p) {}
// 通过接收数据流查找播放窗口
PlayerPanel find(ReceiveStream strm) {}
//实现ReceiveStreamListener监听接口
public synchronized void update(ReceiveStreamEvent evt) {}