2009-10-09 178 views
4

我想创建一个简单的聊天客户端使用red5媒体服务器,但我似乎有轻微的呃逆。我正在服务器端创建一个共享对象,并且它似乎正在成功创建它。但是,当我通过客户机更改对象(键入消息)时,会触发SYNC事件,但共享对象内的内容仍为空。我怀疑我在java端做了什么错误,有什么建议?简单的远程共享对象与Red5 Flash服务器

控制台结果:

Success! 

Server Message: clear 

Server Message: [object Object] 

Local message: asdf 

Server Message: change 

Server Message: [object Object] 

Local message: fdsa 

Server Message: change 

Server Message: [object Object] 

Local message: fewa 

Server Message: change 

Server Message: [object Object] 

服务器端:

package org.red5.core; 

import java.util.List; 

import org.red5.server.adapter.ApplicationAdapter; 
import org.red5.server.api.IConnection; 
import org.red5.server.api.IScope; 
import org.red5.server.api.service.ServiceUtils; 
import org.red5.server.api.so.ISharedObject; 
// import org.apache.commons.logging.Log; 
// import org.apache.commons.logging.LogFactory; 

public class Application extends ApplicationAdapter { 
    private IScope appScope; 
    // private static final Log log = LogFactory.getLog(Application.class); 

    /** {@inheritDoc} */ 
    @Override 
    public boolean connect(IConnection conn, IScope scope, Object[] params) { 

     appScope = scope; 
     createSharedObject(appScope, "generalChat", false); // Creates general chat shared object 

     return true; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void disconnect(IConnection conn, IScope scope) { 
     super.disconnect(conn, scope); 
    } 

    public void updateChat(Object[] params) 
    { 
     ISharedObject so = getSharedObject(appScope, "generalChat"); // Declares and stores general chat data in general chat shared object 
     so.setAttribute("point", params[0].toString()); 
    } 
} 

客户端:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.net.*; 


    // This class is going to handle all data to and from from media server 
    public class SOConnect extends MovieClip 
    { 
     // Variables 
     var nc:NetConnection = null; 
     var so:SharedObject;   
     public function SOConnect():void 
     { 
     } 
     public function connect():void 
     {  
      // Create a NetConnection and connect to red5 
      nc = new NetConnection(); 
      nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
      nc.connect("rtmp://localhost/testChat"); 

      // Create a StoredObject for general chat 
      so = SharedObject.getRemote("generalChat", nc.uri, false);   
      so.connect(nc); 
      so.addEventListener(SyncEvent.SYNC, receiveChat)    
     } 

     public function sendChat(msg:String) 
     { 
      trace ("Local message: " + msg); 
      nc.call("updateChat", null, msg)      
     } 


     public function receiveChat(e:SyncEvent):void 
     {   
      for (var i in e.changeList) 
      { 
       trace ("Server Message: " + e.changeList[i].code) 
       trace ("Server Message: " + e.changeList[i]) 
      }      
     } 

     // Given result, determine successful connection   
     private function netStatusHandler(e:NetStatusEvent):void 
     { 
      if (e.info.code == "NetConnection.Connect.Success") 
      { 
       trace("Success!"); 
      } 
      else 
      { 
       trace("Failure!\n");  
       trace(e.info.code); 
      } 
     } 
    } 
} 
+1

我在想,red5简单聊天不需要服务器端脚本,就像视频流一样 – Omu 2009-10-28 13:09:26

+0

red5共享对象教程在youtube上:http://www.youtube.com/watch?v=0MuLnMKYe9k&playnext=1&list = PL310F0481BCE4D194&设有= results_main – 2012-10-21 13:17:48

回答

0

是它的更多钞票无需编写服务器端代码中创建一个聊天,但我不看怎么有人可以控制用户断开连接或使用同步的用户列表,反正回到主题也许你有一个dir权限问题,所以尝试以root/admin身份运行red5一次,只是为了检查它是否有效,如果它应该在系统中创建一个用户(具有正确的写入权限),然后使用该用户运行red5 。