Java 从flex应用程序连接到red5远程共享对象
我正在写一个Flex应用程序 服务器端应用程序是位于Red5 1.0之上的Java应用程序。 该连接通过RTMPE protcol进行。(结果与RTMP或RTMPE相同) 我能够正确连接到服务器并进出房间,但无法连接到房间中的共享对象。使用非持久性共享对象 我使用以下代码在服务器端的房间中创建共享对象:Java 从flex应用程序连接到red5远程共享对象,java,apache-flex,red5,shared-objects,Java,Apache Flex,Red5,Shared Objects,我正在写一个Flex应用程序 服务器端应用程序是位于Red5 1.0之上的Java应用程序。 该连接通过RTMPE protcol进行。(结果与RTMP或RTMPE相同) 我能够正确连接到服务器并进出房间,但无法连接到房间中的共享对象。使用非持久性共享对象 我使用以下代码在服务器端的房间中创建共享对象: private void createSharedObject (IScope scope, String soName, boolean persistent) { ISharedOb
private void createSharedObject (IScope scope, String soName, boolean persistent) {
ISharedObjectService service= (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
service.createSharedObject(scope, soName, persistent);
}
private ISharedObject getSharedObject(IScope scope, String soName,boolean persistent) {
ISharedObjectService service = (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
return service.getSharedObject(scope, soName,persistent);
}
public ISharedObject getRoomSharedObject() {
final String soName = "room_" + this._scope.getName();
log.debug("application found. creating shared object");
log.debug("shared object: {} not found for scope: {}. creating one",new Object[]{soName,this._scope.getContextPath()});
createSharedObject(this._scope, soName, XpoConstants.persistentSharedObjects);
ISharedObject so = getSharedObject(this._scope,soName, XpoConstants.persistentSharedObjects);
so.clear();
return so;
}
IConnection conn = Red5.getConnectionLocal();
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("<function name>", new Object[]{this._so.getName(),...});
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" creationComplete="init()"
minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
private var nc:NetConnection = new NetConnection();
private function init():void {
nc.proxyType = "best";
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
nc.connect("rtmpe://127.0.0.1/ufktest");
}
private function checkConnect (event:NetStatusEvent):void
{
switch (event.info['code']) {
case 'NetConnection.Connect.Success':
{
_red5Connected();
trace('connected succesfully');
break;
}
case 'NetConnection.Connect.Closed':
{
_red5Disconnected();
trace('connection closed');
break;
}
case 'NetConnection.Connect.Rejected':
{
_red5Disconnected();
trace('connection rejected' );
break;
}
case 'NetConnection.Connect.Failed':
{
_red5Disconnected();
trace('connection failed');
break;
}
case 'NetConnection.Connect.AppShutDown':
{
trace('app shut down');
_red5Disconnected();
break;
}
default:
{
trace("unknown netconenction status: " + event.info['code']);
break;
}
}
}
private function _red5Connected():void {
trace("red5 connection was successful");
var roomSharedObject:SharedObject = SharedObject.getRemote("moshe",nc.uri,false);
roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, _parse);
roomSharedObject.addEventListener(SyncEvent.SYNC,_parse2);
roomSharedObject.connect(nc);
}
private function _parse(e:NetStatusEvent):void {
trace("NETSTATUSEVENT");
trace("########## EVENT INFO CODE: " + e.info.code);
}
private function _parse2(e:SyncEvent):void {
trace("SYNCEVENT");
}
private static function _red5Disconnected():void {
trace("disconnected from red5");
Alert.show("could not connect to server, please try again later");
}
]]>
</fx:Script>
然后,用户进入适当的房间,我获得连接,并在其端调用一个函数,并提供共享对象名称,以便他知道使用以下代码连接到什么:
private void createSharedObject (IScope scope, String soName, boolean persistent) {
ISharedObjectService service= (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
service.createSharedObject(scope, soName, persistent);
}
private ISharedObject getSharedObject(IScope scope, String soName,boolean persistent) {
ISharedObjectService service = (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
return service.getSharedObject(scope, soName,persistent);
}
public ISharedObject getRoomSharedObject() {
final String soName = "room_" + this._scope.getName();
log.debug("application found. creating shared object");
log.debug("shared object: {} not found for scope: {}. creating one",new Object[]{soName,this._scope.getContextPath()});
createSharedObject(this._scope, soName, XpoConstants.persistentSharedObjects);
ISharedObject so = getSharedObject(this._scope,soName, XpoConstants.persistentSharedObjects);
so.clear();
return so;
}
IConnection conn = Red5.getConnectionLocal();
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("<function name>", new Object[]{this._so.getName(),...});
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" creationComplete="init()"
minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
private var nc:NetConnection = new NetConnection();
private function init():void {
nc.proxyType = "best";
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
nc.connect("rtmpe://127.0.0.1/ufktest");
}
private function checkConnect (event:NetStatusEvent):void
{
switch (event.info['code']) {
case 'NetConnection.Connect.Success':
{
_red5Connected();
trace('connected succesfully');
break;
}
case 'NetConnection.Connect.Closed':
{
_red5Disconnected();
trace('connection closed');
break;
}
case 'NetConnection.Connect.Rejected':
{
_red5Disconnected();
trace('connection rejected' );
break;
}
case 'NetConnection.Connect.Failed':
{
_red5Disconnected();
trace('connection failed');
break;
}
case 'NetConnection.Connect.AppShutDown':
{
trace('app shut down');
_red5Disconnected();
break;
}
default:
{
trace("unknown netconenction status: " + event.info['code']);
break;
}
}
}
private function _red5Connected():void {
trace("red5 connection was successful");
var roomSharedObject:SharedObject = SharedObject.getRemote("moshe",nc.uri,false);
roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, _parse);
roomSharedObject.addEventListener(SyncEvent.SYNC,_parse2);
roomSharedObject.connect(nc);
}
private function _parse(e:NetStatusEvent):void {
trace("NETSTATUSEVENT");
trace("########## EVENT INFO CODE: " + e.info.code);
}
private function _parse2(e:SyncEvent):void {
trace("SYNCEVENT");
}
private static function _red5Disconnected():void {
trace("disconnected from red5");
Alert.show("could not connect to server, please try again later");
}
]]>
</fx:Script>
我从red5得到的唯一信息如下:
[INFO] [pool-8-thread-12] org.red5.server.so.SharedObject - Deleting shared object room_3963 because all clients disconnected and it is no longer acquired.
我猜NetStatusEvent应该被触发,这可能是某种错误消息
但我根本没有收到任何跟踪信息!我从red5中得到的唯一信息是,共享对象被删除了,这意味着该客户端尝试连接了一秒钟,然后断开了连接
我厌倦了谷歌,厌倦了red5谷歌集团。我迷路了!
如能提供有关该问题的任何信息,将不胜感激
谢谢大家!
更新
好的,我创建了一个较小的客户端和服务器
在服务器上,appConnect函数只返回true
该客户端是flex 4.6客户端,具有以下代码:
private void createSharedObject (IScope scope, String soName, boolean persistent) {
ISharedObjectService service= (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
service.createSharedObject(scope, soName, persistent);
}
private ISharedObject getSharedObject(IScope scope, String soName,boolean persistent) {
ISharedObjectService service = (ISharedObjectService) ScopeUtils
.getScopeService(scope,
ISharedObjectService.class,
false);
return service.getSharedObject(scope, soName,persistent);
}
public ISharedObject getRoomSharedObject() {
final String soName = "room_" + this._scope.getName();
log.debug("application found. creating shared object");
log.debug("shared object: {} not found for scope: {}. creating one",new Object[]{soName,this._scope.getContextPath()});
createSharedObject(this._scope, soName, XpoConstants.persistentSharedObjects);
ISharedObject so = getSharedObject(this._scope,soName, XpoConstants.persistentSharedObjects);
so.clear();
return so;
}
IConnection conn = Red5.getConnectionLocal();
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("<function name>", new Object[]{this._so.getName(),...});
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" creationComplete="init()"
minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
private var nc:NetConnection = new NetConnection();
private function init():void {
nc.proxyType = "best";
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
nc.connect("rtmpe://127.0.0.1/ufktest");
}
private function checkConnect (event:NetStatusEvent):void
{
switch (event.info['code']) {
case 'NetConnection.Connect.Success':
{
_red5Connected();
trace('connected succesfully');
break;
}
case 'NetConnection.Connect.Closed':
{
_red5Disconnected();
trace('connection closed');
break;
}
case 'NetConnection.Connect.Rejected':
{
_red5Disconnected();
trace('connection rejected' );
break;
}
case 'NetConnection.Connect.Failed':
{
_red5Disconnected();
trace('connection failed');
break;
}
case 'NetConnection.Connect.AppShutDown':
{
trace('app shut down');
_red5Disconnected();
break;
}
default:
{
trace("unknown netconenction status: " + event.info['code']);
break;
}
}
}
private function _red5Connected():void {
trace("red5 connection was successful");
var roomSharedObject:SharedObject = SharedObject.getRemote("moshe",nc.uri,false);
roomSharedObject.addEventListener(NetStatusEvent.NET_STATUS, _parse);
roomSharedObject.addEventListener(SyncEvent.SYNC,_parse2);
roomSharedObject.connect(nc);
}
private function _parse(e:NetStatusEvent):void {
trace("NETSTATUSEVENT");
trace("########## EVENT INFO CODE: " + e.info.code);
}
private function _parse2(e:SyncEvent):void {
trace("SYNCEVENT");
}
private static function _red5Disconnected():void {
trace("disconnected from red5");
Alert.show("could not connect to server, please try again later");
}
]]>
</fx:Script>
这样做似乎过于复杂。如果您使用Flex方法
SharedObject::getRemote
,所有这些都将为您解决。如果对象存在,客户端将获得一个副本。如果该对象不存在,则将创建该对象。所以“房间”中的第一个人创建了这个对象,任何稍后出现的人都会得到一个副本。还有日志吗?但是,您的日志表明共享对象已在服务器上成功创建。请尝试在roomStart()
内或您创建共享对象的任何位置使用acquire()方法创建共享对象(roomStart()
应该是正确的位置)。默认情况下,如果没有连接客户端,服务器将销毁任何共享对象。共享对象是在创建文件室时创建的。我正在用数据更新共享对象,但由于某些原因,flex应用程序的connect函数不会返回任何状态或任何错误,从而无法进行调试。此外我想向共享对象输入一些数据。我必须先创建它。您可以在服务器上捕获创建过程并用初始数据填充它。我在想,除非有客户进来,否则这个房间是不存在的。我正在捕获一个roomstart,并在这种情况下创建一个共享对象。我认为问题不在服务器端,而是在客户端。为什么connect函数根本不返回任何状态?您能捕获共享对象的创建吗?那么预填充它?我在每个房间的共享对象中为每个玩家的每场比赛共享一个实时评分系统。这样做的正确方法是什么?你能提供代码样本吗?