收到相同数据的一个拷贝。但是多个接收者必须都注册加入同一多播组。IP多播服务是一种开放的服务模型,任何主机可以随时加入或退出某个多播组。
利用这种思想,可以实现会议中的多点对多点的视频传输,已达到组织会议的目的。多播系统结构图:
图4.4多播系统结构图
多播实现过程:
group=InetAddress.getByName(MuiltAddr);//设置组播地址
socket=newMulticastSocket(port);//创建MulticastSocket类并将端口与之关联
socket.joinGroup(group);//加入此组播组
4.3系统界面的详细设计
本系统在进行界面设计的时候考虑了系统的功能,对各功能模块进行详细合理的布局:
1.把一些功能加到界面中的菜单中,有连接服务器,连接视频,断开连接,退出等子菜单项。
2.在界面中添加在线用户列表框,用以显示在线的用户。
3.在界面中用一个大的Panel装载举行会议时的各个用户的视频框。
4.在界面中添加实现简单聊天室功能的聊天文本框。
5.在界面底端有一些功能按钮,如连接视频,发送信息等。
第五章系统实现
5.1系统开发环境
系统:MicrosoftWindowsXPProfessionalServicePack2
开发语言:JAVA
编程环境:Eclipse
JMF版本:JMF2.1.1
JDK版本:JDK5.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(newInetSocketAddress(InetAddress.getByName
(serverAddress),12345));//连接到服务器
receiveMessage=newReceivingThread();//构造接收信息线程
receiveMessage.start();//运行线程
socketChannel.write(writeBuffer);//往通道里写入消息
socketChannel.read(readBuffer);//读取通道中消息
5.2.3视音频发送
视音频数据以RTP实时流的形式发送出去,通过会话管理器(SessionManager)传输RTP数据的步骤为:
1.产生一个JMF处理器(Processor),为每一种RTP格式设置相应的轨迹格式。
2.从处理器获取输出数据源。
3.会话管理器产生一个发送数据流,即以数据源和序号作为参数调用会话管理器的createSendStream()方法。
4.开始会话传输。
5.通过监听ControllerEvent事件控制会话的过程。
6.停止会话,删除会话管理器。
定义以下内容:
//媒体定位IP端口处理器会话管理器输出数据源
privateMediaLocatorLocator;
privateStringIpAddress;
privateintportBase;
privateProcessorprocessor=null;
privateRTPMangerrtpMgrs[];
privateDataSourcedataOutput=null;
具体实现函数如下:
//发送数据函数
publicRTPTransmit(Processorprocessor,StringipAddress,Stringpb){}
//为媒体定位器产生一个处理器
privateStringcreateProcessor(){}
//为处理器的每一个媒体磁道产生一个RTP会话
privateStringcreateTransmitter(){}
//让处理器开始传输
publicsynchronizedStringstart(){}
//停止传输
publicvoidstop(){}
//组播线程类
classCreateJoinMuiltcastThreadextendsThread{}
//处理器的状态监听器类
classStateListenerimplementsControllerListener{}
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.给播放器添加监听器,等到播放器实现后,即可显示播放数据。
定义以下内容:
Stringsessions[]=null;//RTP会话字符串数组
RTPManagermgrs[]=null;//RTP管理器数组
VectorplayerPanels=null;//管理播放器窗口的向量
booleandataReceived=false;//是否接收到数据的标志
ObjectdataSync=newObject();//同步对象
具体实现函数如下:
//接收数据实现函数
publicReceive(Stringsessions[]){}
//初始化RTP会话,准备接收数据
protectedbooleaninitialize(){}
//关闭播放窗口
protectedvoidclose(){}
//判断数据是否接收完成
publicbooleanisDone(){}
//通过播放器查找播放窗口
PlayerPanelfind(Playerp){}
//通过接收数据流查找播放窗口
PlayerPanelfind(ReceiveStreamstrm){}
//实现ReceiveStreamListener监听接口
publicsynchronizedvoidupdate(ReceiveStreamEventevt){}
第六章性能测试与分析
6.1测试实例(测试集)的研究与选择
测试是为了发现程序中的错误而执行程序的过程。好的测试方案是尽可能发现尚未发现的错误的测试方案。
本节分别介绍各个功能的测试用例及其预期结果。
1.测试服务器的开启:
在搭建好运行环境后,运行,服务器正常连接。(如有问题时,系统抛出异常,提示开启失败对话框)
2.测试用户连接服务器:
在开启服务器之后,用户进行连接,由于开始是在寝室连接,速度比较慢,所以连接超时,抛出异常。后又在其他地方连接成功。
3.测试举行会议部分:
进行视频连接,连接成功,在视频会议过程中,视音频的传输都成功。后又请同学用
上一篇:
(jsp+sql)java论坛管理系统,包括论文和程序(论文和程序)
下一篇:
智能手机操作系统与刷机论文