views:

3017

answers:

2

Hello,

I am trying to create a simple chat client using the red5 media server, but I seem to be having a slight hiccup. I am creating a shared object on the server side, and it seems to be creating it successfully. However, when I make changes to the object via the client (type a message), the SYNC event fires, but the content within the shared object remains empty. I suspect I am doing something wrong on the java end, any advice?

Console Results:

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]

Server Side:

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

Client Side:

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);
      }
     }
    }
}
+3  A: 

you don't need to write anything on the server side in order to do a chat in as3 and red5;

here is an example for you the chat that it is working and it is written in as3/flex3

Omu
A: 

Yes its posible to create a chat without writing server side code but i dont see how someone could control users disconnections or use lists of users on sync, anyway back to the subject maybe you have a problem with dir permissions so try running red5 as root/admin once , just to check if it works, if it does you should create a user (with the correct writing permissions) in your system and then run red5 using that user.