JAVA+fms

最近完成的 Java Flex Fms 视频聊天程序,虽然说同类的东西还是有的,但是这是我自己写的。 和大家交流一下,由于要配置fms3 服务器端,和mySql 数据库所以,源代码配置起来很麻烦,要代码的话和我联系。 说一下和java 有关的部分,因为视频走的是fms,所以和java代码部分没有任何关系。 java的功能部分主要有这么几个: 1.建立socket Tcp/Ip连接到服务器端。 2.实现在线列表,好友列表,黑名单等功能。 3.发送消息,控制有关申请,拒接等控制操作。 4.连接mySql数据库,对登录信息进行管理。 功能的解释在 http://ltoooooooo.javaeye.com/blog/424008 下面发一下截图: (登录&注册) (单聊申请) (单聊对话框) (视频申请) (视频聊天窗口)

 

 

 

 

继续上一篇,写一下有关的代码。

 

声明一下:本人才疏学浅,有什么不妥的地方,多加指正,先谢谢了

 

Java方面和一般的socket聊天室一样,就是建立一个数据库,连接的方法不再细说.

在线列表实现方法:

建立个线程池,vector,在每个线程中增加一个变量,用来存储账号信息,就是当用户连接的时候,服务器端遍历这个vector把用户列表发给客户端。

单聊,广播实现方法:

由于加入了用户账号的信息,只要找到这个线程,用输出流,输出即可。广播就是给线程池里的所有人发就行。

socket:

在java端建立 ServerSocket,等待flash 连接。客户端向服务器端发数据,包括控制信息,分别用不同的开头表示,如在java 端收到

Java代码 
  1. try{  
  2.                   while(true){  
  3.                        
  4.                       line=inse.readUTF();  
  5.                       if(line.startsWith("000")){//000 开头的为普通信息,不同卡头处理不同  
  6.                           
  7.                        myserver.sendmeseage(line);  
  8.                   
  9.                       }  
  10. }catch(e){  
  11.     异常时执行  
  12. }finally{  
  13.     客户端退出时执行  
  14. }  

 

 

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 哦!

 

As3代码 
  1. appServer="rtmp://127.0.0.1/test_video1";  
  2.  netConnection = new NetConnection();  
  3.  netConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);  
  4.  netConnection.connect(appServer);  
  5.  netConnection.client=this;//标示客户端,别忘了哦!  

 

 NetStatusEvent.NET_STATUS监听连接事件,结果要执行netStatusHandler 函数。

 NetConnection.Connect.Success 是连接成功。否则失败,下面是事件的处理函数

 

As3代码 
  1. private function netStatusHandler(evt:NetStatusEvent):void  
  2. {     
  3.  if ( evt.info.code=="NetConnection.Connect.Success" )  
  4.  {  
  5.   startCommunicate();//成功,继续执行  
  6.  }  
  7.  else  
  8.  {  
  9.   Alert.show("fms连接失败"+evt.info.code);  
  10.  }  
  11. }  

 

5.连接成功后

  在FMS服务端有代码: 把这个代码拷贝到记事本中,另存为test_video1.asc(flash as 通信文件),放在test_video1文件中,注意:这两个文件名要一样

 

As代码 
  1. <span style="white-space: normal;"> <span style="white-space: pre;">userList=[];</span></span>  
  2.   
  3. application.onAppStart=function()  
  4. {  
  5.  trace("fms服务器启动......");  
  6. }  
  7.   
  8. application.onConnect = function(currentClient)  
  9. {             
  10.   currentClient.communicateServer= function(value)  
  11.   {  
  12.    currentClient.username=value;  
  13.    for(j=0;j<userList.length;j++)  
  14.  {  
  15.   if ( userList[j]==currentClient.username)  
  16.   {  
  17.    userList.splice(j,1);  
  18.   }  
  19.  }  
  20.    userList.push(value);  
  21.    trace("当前用户列表"+userList);   
  22.    application.broadcastMsg("playVideo",userList);  
  23.   }  
  24.  }  
  25. }  
  26.   
  27. application.onDisconnect=function(currentClient)  
  28. {  
  29.  trace("用户"+currentClient.username+"离开聊天室");  
  30.    
  31.  for(j=0;j<userList.length;j++)  
  32.  {  
  33.   if ( userList[j]==currentClient.username)  
  34.   {  
  35.    userList.splice(j,1);  
  36.   }  
  37.  }  
  38.  trace("当前用户列表"+userList);  
  39.  application.broadcastMsg("playOtherVideo",userList);  
  40.  application.broadcastMsg("hisOut",currentClient.username);//本例子不涉及  
  41. }  

   几个需要解释的:

     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();

As3代码 
  1. if (!camera)  
  2. {  
  3.      Alert.show( "系统没有检测到摄像头,建议您安装摄像头");  
  4. }  
  5.  camera.setMode(160,100,24);//设置模式,(长,宽,帧率)  
  6.  camera.setQuality(0,100);//设置质量(0为不限制带宽 ,100 质量为100% )  
  7.  onlyVideo.vd1.attachCamera(camera); //onlyVideo.vd1 为 videoDisplay  
  8.  microphone=Microphone.getMicrophone();  

 

    如何把视频传到服务器上?

 

     outNetStream = new NetStream(netConnection);

As3代码 
  1. outNetStream.attachCamera(camera);  
  2. outNetStream.attachAudio(microphone);  
  3. outNetStream.publish(username,"live");//发布视频  

    live 方式是现场流。

 

    如何播放服务器上的现场流?

 

     因为服务器端由很多人的视频,所以要找到和你聊天的人。

 

    public function playVideo(UserList:Array):void//传来客户端的列表

As3代码 
  1. {  
  2.    
  3.  for(var i:int=0;i<UserList.length;i++)  
  4.  {  
  5.   if ( UserList[i]==onlyVideo.toWho)//找到要播放谁的视频 onlyVideo.toWho 是聊天窗口的对方  
  6.   {  
  7.    var video:Video = new Video();  
  8.    video.width=160;  
  9.    video.height=100;  
  10.    var inNetStream:NetStream= new NetStream(netConnection);  
  11.    video.attachNetStream(inNetStream);  
  12.    inNetStream.play(newUserList[i]);  
  13.    onlyVideo.vd2.addChild(video);   //onlyVideo.vd2 为 videoDisplay  
  14.   }  
  15.  }  
  16. }  

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值