继续上一篇,写一下有关的代码。
声明一下:本人才疏学浅,有什么不妥的地方,多加指正,先谢谢了
Java方面和一般的socket聊天室一样,就是建立一个数据库,连接的方法不再细说.
在线列表实现方法:
建立个线程池,vector,在每个线程中增加一个变量,用来存储账号信息,就是当用户连接的时候,服务器端遍历这个vector把用户列表发给客户端。
单聊,广播实现方法:
由于加入了用户账号的信息,只要找到这个线程,用输出流,输出即可。广播就是给线程池里的所有人发就行。
socket:
在java端建立 ServerSocket,等待flash 连接。客户端向服务器端发数据,包括控制信息,分别用不同的开头表示,如在java 端收到
try{
while(true){
line=inse.readUTF();
if(line.startsWith("000")){//000 开头的为普通信息,不同卡头处理不同
myserver.sendmeseage(line);
}
}catch(e){
异常时执行
}finally{
客户端退出时执行
}
java Tcp/Ip的构架就不说。网上一般都有介绍,下面说一下fms的配置,使用。我这个一个相当简单的例子。(再次强调:视频是flex连接fms 与java 端无关)
1,下载fms 3 安装,一路下一步,当要输入序列号的时候,空着不填,就是开发者版本,有个连接数的限制,但功能上不会有限制。记住用户名,密码
2,按安装路径打开这个 就两个用的上的东西

applications 为远程要连接的文件,放在下面,就是是说所有的东西都爱要放在这里,相当于PHP的WWW
fms_adminConsole.swf 为控制的软件。
3.安装后要启动服务,一般已启动,有必要的话,可以打开它,在tool 文件夹中。

4.连接这个服务器。
我们在applications 下建立这么个文件夹 test_video1。用RTMP 协议,不是HTTP 哦!
appServer="rtmp://127.0.0.1/test_video1"; netConnection = new NetConnection(); netConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); netConnection.connect(appServer); netConnection.client=this;//标示客户端,别忘了哦!
NetStatusEvent.NET_STATUS监听连接事件,结果要执行netStatusHandler 函数。
NetConnection.Connect.Success 是连接成功。否则失败,下面是事件的处理函数
private function netStatusHandler(evt:NetStatusEvent):void
{
if ( evt.info.code=="NetConnection.Connect.Success" )
{
startCommunicate();//成功,继续执行
}
else
{
Alert.show("fms连接失败"+evt.info.code);
}
}
5.连接成功后
在FMS服务端有代码: 把这个代码拷贝到记事本中,另存为test_video1.asc(flash as 通信文件),放在test_video1文件中,注意:这两个文件名要一样
userList=[];
application.onAppStart=function()
{
trace("fms服务器启动......");
}
application.onConnect = function(currentClient)
{
currentClient.communicateServer= function(value)
{
currentClient.username=value;
for(j=0;j<userList.length;j++)
{
if ( userList[j]==currentClient.username)
{
userList.splice(j,1);
}
}
userList.push(value);
trace("当前用户列表"+userList);
application.broadcastMsg("playVideo",userList);
}
}
}
application.onDisconnect=function(currentClient)
{
trace("用户"+currentClient.username+"离开聊天室");
for(j=0;j<userList.length;j++)
{
if ( userList[j]==currentClient.username)
{
userList.splice(j,1);
}
}
trace("当前用户列表"+userList);
application.broadcastMsg("playOtherVideo",userList);
application.broadcastMsg("hisOut",currentClient.username);//本例子不涉及
}
几个需要解释的:
1.定义一个数组用于存放客户端名称。
2.application.onConnect在连接是执行。里面定义的方法,要在客户端调用。
3.application.broadcastMsg("playVideo",userList);为广播,调用所有客户端的playVideo函数,后面为参数。
4.application.onDisconnect=function(currentClient),为断开连接时执行,像Java中的finally。
客户端:
responder=new Responder(dovideo);//定义一个回调函数 netConnection.call("communicateServer",responder,username);
解释一下:responder 为一个回调函数,,意思是在执行netConnection.call这句时,先在远程服务器端执行communicateServer 这个函数,执行后在执行客户端responder 的函数,
username是要传递的参数。
自此连接的阶段完成了,并且把客户端记录在数组中。方便以后查找,因为我们要完成的是单聊。
6.进入下个阶段,视频:
如何获取本地视频?
用摄像头就行啊! camera = Camera.getCamera();
if (!camera)
{
Alert.show( "系统没有检测到摄像头,建议您安装摄像头");
}
camera.setMode(160,100,24);//设置模式,(长,宽,帧率)
camera.setQuality(0,100);//设置质量(0为不限制带宽 ,100 质量为100% )
onlyVideo.vd1.attachCamera(camera); //onlyVideo.vd1 为 videoDisplay
microphone=Microphone.getMicrophone();
如何把视频传到服务器上?
outNetStream = new NetStream(netConnection);
outNetStream.attachCamera(camera); outNetStream.attachAudio(microphone); outNetStream.publish(username,"live");//发布视频
live 方式是现场流。
如何播放服务器上的现场流?
因为服务器端由很多人的视频,所以要找到和你聊天的人。
public function playVideo(UserList:Array):void//传来客户端的列表
{
for(var i:int=0;i<UserList.length;i++)
{
if ( UserList[i]==onlyVideo.toWho)//找到要播放谁的视频 onlyVideo.toWho 是聊天窗口的对方
{
var video:Video = new Video();
video.width=160;
video.height=100;
var inNetStream:NetStream= new NetStream(netConnection);
video.attachNetStream(inNetStream);
inNetStream.play(newUserList[i]);
onlyVideo.vd2.addChild(video); //onlyVideo.vd2 为 videoDisplay
}
}
}
还是那句话:本人才疏学浅,有什么不妥的地方,多加指正,先谢谢了
本文介绍了一种使用Flex与Flash Media Server (FMS) 结合Java技术搭建视频聊天室的方法。详细讲解了从服务器端到客户端的连接配置过程、视频流的传输与播放实现细节。
1222

被折叠的 条评论
为什么被折叠?



