0

アプリケーションのソース コードfitcDemoを Red5 用に変更し、サーバーに接続する前に何らかの方法でユーザー名を認証させようとしていますが、開始方法がわかりません。
つまり、クライアント接続時にどのメソッドが呼び出されるのか、クライアント アプリからユーザー名を取得する方法がわからないということです。
誰かが私を助けることができるように、ソースコードをここに持ってきます。

package org.xyz;

import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.stream.IBroadcastStream;
import org.red5.server.api.stream.IPlayItem;
import org.red5.server.api.stream.IPlaylistSubscriberStream;
import org.red5.server.api.stream.IStreamAwareScopeHandler;
import org.red5.server.api.stream.ISubscriberStream;


public class Application extends ApplicationAdapter
  implements IPendingServiceCallback, IStreamAwareScopeHandler
{
  protected static Log log = LogFactory.getLog(Application.class);

  public boolean appStart(IScope scope)
  {
    return true;
  }

  public boolean appConnect(IConnection conn, Object[] params)
  {
    IServiceCapableConnection service = (IServiceCapableConnection)conn;
    log.info("Client connected {} conn {}");
    service.invoke("setId", new Object[] { conn.getClient().getId() }, this);
    return true;
  }

  public boolean appJoin(IClient client, IScope scope)
  {
    log.info("Client joined app {}");

    IConnection conn = Red5.getConnectionLocal();
    return true;
  }

  public void streamPublishStart(IBroadcastStream stream)
  {
    if (log.isDebugEnabled()) {
      log.debug("stream broadcast start: {}");
    }
    IConnection current = Red5.getConnectionLocal();
    for (Set<IConnection> connections : this.scope.getConnections())
      for (IConnection conn : connections) {
        if (conn.equals(current))
        {
          continue;
        }

        if ((conn instanceof IServiceCapableConnection)) {
          ((IServiceCapableConnection)conn).invoke("newStream", new Object[] { stream.getPublishedName() }, this);

          if (log.isDebugEnabled())
            log.debug("sending notification to {}");
        }
      }
  }

  public void streamRecordStart(IBroadcastStream stream)
  {
  }

  public void streamBroadcastClose(IBroadcastStream stream)
  {
  }

  public void streamBroadcastStart(IBroadcastStream stream)
  {
  }

  public void streamPlaylistItemPlay(IPlaylistSubscriberStream stream, IPlayItem item, boolean isLive)
  {
  }

  public void streamPlaylistItemStop(IPlaylistSubscriberStream stream, IPlayItem item)
  {
  }

  public void streamPlaylistVODItemPause(IPlaylistSubscriberStream stream, IPlayItem item, int position)
  {
  }

  public void streamPlaylistVODItemResume(IPlaylistSubscriberStream stream, IPlayItem item, int position)
  {
  }

  public void streamPlaylistVODItemSeek(IPlaylistSubscriberStream stream, IPlayItem item, int position)
  {
  }

  public void streamSubscriberClose(ISubscriberStream stream)
  {
  }

  public void streamSubscriberStart(ISubscriberStream stream)
  {
  }

  public List<String> getStreams()
  {
    IConnection conn = Red5.getConnectionLocal();
    return getBroadcastStreamNames(conn.getScope());
  }

  public void resultReceived(IPendingServiceCall call)
  {
    log.info("Received result {} for {}");
  }
}
4

1 に答える 1

1

Red5 はそれを行う方法を提供していますが、 Red5 API を使用してパブリッシャーとコンシューマーを識別する方法 データベースを使用してそれらを異なる方法で識別する必要があったため、これが私のアプローチでした。すでに red5 のユーザー関連テーブルを使用してデータベースに接続していると仮定します。そうでない場合は、公式のチュートリアルから始めてください: http://www.red5tutorials.net/index.php/Tutorials:MySQL_and_Red5 チュートリアルは MySQL 用ですが、データベースに適切な JDBC ドライバーを使用できます。

最初に、as3 を使用して Flash の NetConnection の connect() でクライアントからユーザー ID を送信する必要があります。

var nc:NetConnection = new NetConnection();
var userID:String = "foo";
nc.connect("rtmp://" + ipAddrOfRed5Server + "/fitcDemo", userID);

Red5 では:

public boolean appConnect(IConnection conn , Object[] params )
{
    try { 
         String uID = (String)params[0];             
         //Run a query here to check if the user exists in the DB. 
             // If not, you can call rejectClient("Not an existing user!");
             // Once authenticated here, your normal logic follows
    }
    } catch(Exception e){
        e.printStackTrace();
        log.error("Error handling User connect"); 
    }       
    return true;

}
于 2012-05-24T07:24:32.443 に答える