Actionscript 3 在不使用服务器套接字的AS3(AIR)客户端中侦听传入连接

Actionscript 3 在不使用服务器套接字的AS3(AIR)客户端中侦听传入连接,actionscript-3,sockets,air,serversocket,Actionscript 3,Sockets,Air,Serversocket,我设法创建了一个C#服务器,它使用sockets向AS3(AIR)客户端发送文件。在AS3端,我使用flash.net.Socket库通过TCP接收数据 这就是它的工作原理: ->我打开服务器,它会监听客户端(另外我还可以创建一个连接设备的列表) ->我打开我的客户机,它会自动接收数据 接收数据的触发事件在客户机上进行,即,我只是打开服务器,当客户机打开时,它获取数据,触发这些事件: socket.addEventListener(Event.CONNECT, onConnect); ->

我设法创建了一个C#服务器,它使用
sockets
向AS3(AIR)客户端发送文件。在AS3端,我使用
flash.net.Socket
库通过
TCP
接收数据

这就是它的工作原理:
->我打开服务器,它会监听客户端(另外我还可以创建一个连接设备的列表)
->我打开我的客户机,它会自动接收数据

接收数据的触发事件在客户机上进行,即,我只是打开服务器,当客户机打开时,它获取数据,触发这些事件:

socket.addEventListener(Event.CONNECT, onConnect); -> to connect to the server  
socket.addEventListener(Event.SOCKET_DATA, onDataArrival); -> to receive the data  
现在我想做一些不同的事情。我不想在客户端触发它,我想让服务器这样做,也就是说,我想打开我的客户端,在服务器上输入客户端将获取数据的内容

那么,为什么我要将客户机设置为客户机/服务器呢?因为我的服务器是一台机器,我的客户端是连接服务器的XXX移动设备,这是我实现这一点的方法

因此,根据我刚才所说的,我使用
flash.net.ServerSocket
库创建了我的AS3客户机/服务器应用程序,它的工作方式与我所希望的一样

首先,我让客户机倾听:

serverSocket.bind(portNumber, "10.1.1.212");
serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnectServer);
serverSocket.listen();
然后我使用
flash.net.Socket
Event.Socket\u data

差不多就是这样。就像我想要的那样工作。
但是,
flash.net.ServerSocket
与移动设备不兼容,但是

所以我的问题是:我需要将文件从C#server(需要监听客户端,以便我可以创建连接设备的列表)发送到AS3(AIR)客户端,但我必须定义哪个客户端正在服务器上获取数据,客户端需要准备随时接收该数据,因此,需要监听,但有很多,这就是为什么我认为他们是客户的原因。p> 我的问题是:有没有一种方法可以让客户端侦听传入的连接并在事件发生时触发事件,而不使用AS3中的服务器套接字


另外,如果您有一种不同的方法来实现我的目标,而不使用C#server AS3客户机/服务器逻辑,请随意发表您的意见。

是的。您的客户端应通过
flash.net.Socket
()或
flash.net.XMLSocket
()连接到服务器。在大多数情况下,您只需要一个服务器,多个客户端可以连接到该服务器。不完全清楚为什么两端都有服务器

编辑:

下面是一个客户端使用
套接字持续侦听服务器消息的快速示例。这将连接到服务器,然后(无限期)等待数据。当接收到数据块时(在本例中,我希望字符串以新行字符结尾),数据将与事件一起传递

如果您尝试了这种方法但没有成功,您应该查看是否有任何错误或连接是否正在关闭

文档类:

package  {
    import flash.display.Sprite;

    public class Main extends Sprite {
        protected var socket:SocketTest;

        public function Main() {
            this.socket = new SocketTest();
            this.socket.addEventListener(SocketMessageEvent.MESSAGE_RECEIVED, onSocketMessage);
            this.socket.connect("127.0.0.1", 7001);
        }

        protected function onSocketMessage(e:SocketMessageEvent):void {
            var date:Date = new Date();
            trace(date.hoursUTC + ":" + date.minutesUTC + ":" + date.secondsUTC + " Incoming message: " + e.message);
        }
    }
}
package  {
    import flash.net.Socket;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.events.ProgressEvent;
    import flash.errors.IOError;

    public class SocketTest extends Socket {
        protected var _message:String;

        public function SocketTest() {
            super();
            this._message = "";

            this.addEventListener(Event.CONNECT, socketConnected);
            this.addEventListener(Event.CLOSE, socketClosed);
            this.addEventListener(ProgressEvent.SOCKET_DATA, socketData);
            this.addEventListener(IOErrorEvent.IO_ERROR, socketError);
            this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketError);
        }

        protected function socketData(event:ProgressEvent):void {
            var str:String = readUTFBytes(bytesAvailable);

            //For this example, look for \n as a message terminator
            var messageParts:Array = str.split("\n");

            //There could be multiple messages or a partial message, 
            //pass on complete messages and buffer any partial
            for (var i = 0; i < messageParts.length; i++) {
                this._message += messageParts[i];
                if (i < messageParts.length - 1) {
                    this.notifyMessage(this._message);
                    this._message = "";
                }
            }
        }

        protected function notifyMessage(value:String):void {
            this.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE_RECEIVED, value));
        }

        protected function socketConnected(event:Event):void {
            trace("Socket connected");
        }

        protected function socketClosed(event:Event):void {
            trace("Connection was closed");
            //TODO: Reconnect if needed
        }

        protected function socketError(event:Event):void {
            trace("An error occurred:", event);
        }
    }
}
package  {
    import flash.events.Event;

    public class SocketMessageEvent extends Event {
        public static const MESSAGE_RECEIVED:String = "messageReceived";

        protected var _message:String;

        public function SocketMessageEvent(type:String, message:String = "", bubbles:Boolean = false, cancelable:Boolean = false) {
            super(type, bubbles, cancelable);
            this._message = message;
        }

        public function get message():String {
            return this._message;
        }
    }
}
SocketTest类:

package  {
    import flash.display.Sprite;

    public class Main extends Sprite {
        protected var socket:SocketTest;

        public function Main() {
            this.socket = new SocketTest();
            this.socket.addEventListener(SocketMessageEvent.MESSAGE_RECEIVED, onSocketMessage);
            this.socket.connect("127.0.0.1", 7001);
        }

        protected function onSocketMessage(e:SocketMessageEvent):void {
            var date:Date = new Date();
            trace(date.hoursUTC + ":" + date.minutesUTC + ":" + date.secondsUTC + " Incoming message: " + e.message);
        }
    }
}
package  {
    import flash.net.Socket;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.events.ProgressEvent;
    import flash.errors.IOError;

    public class SocketTest extends Socket {
        protected var _message:String;

        public function SocketTest() {
            super();
            this._message = "";

            this.addEventListener(Event.CONNECT, socketConnected);
            this.addEventListener(Event.CLOSE, socketClosed);
            this.addEventListener(ProgressEvent.SOCKET_DATA, socketData);
            this.addEventListener(IOErrorEvent.IO_ERROR, socketError);
            this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketError);
        }

        protected function socketData(event:ProgressEvent):void {
            var str:String = readUTFBytes(bytesAvailable);

            //For this example, look for \n as a message terminator
            var messageParts:Array = str.split("\n");

            //There could be multiple messages or a partial message, 
            //pass on complete messages and buffer any partial
            for (var i = 0; i < messageParts.length; i++) {
                this._message += messageParts[i];
                if (i < messageParts.length - 1) {
                    this.notifyMessage(this._message);
                    this._message = "";
                }
            }
        }

        protected function notifyMessage(value:String):void {
            this.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE_RECEIVED, value));
        }

        protected function socketConnected(event:Event):void {
            trace("Socket connected");
        }

        protected function socketClosed(event:Event):void {
            trace("Connection was closed");
            //TODO: Reconnect if needed
        }

        protected function socketError(event:Event):void {
            trace("An error occurred:", event);
        }
    }
}
package  {
    import flash.events.Event;

    public class SocketMessageEvent extends Event {
        public static const MESSAGE_RECEIVED:String = "messageReceived";

        protected var _message:String;

        public function SocketMessageEvent(type:String, message:String = "", bubbles:Boolean = false, cancelable:Boolean = false) {
            super(type, bubbles, cancelable);
            this._message = message;
        }

        public function get message():String {
            return this._message;
        }
    }
}
作为测试,我将服务器设置为每5秒发送一条消息,这是控制台中的输出:

Socket connected
21:36:24 Incoming message: Message from server: 0
21:36:29 Incoming message: Message from server: 1
21:36:34 Incoming message: Message from server: 2
21:36:39 Incoming message: Message from server: 3
21:36:44 Incoming message: Message from server: 4
21:36:49 Incoming message: Message from server: 5

我已经在使用
flash.net.Socket
,可以很好地读取数据。但是接收它的触发器在客户端,而不是服务器上。我搜索了
flash.net.XMLSocket
,但运气不好。我用更多信息更新了我的主线程。我仍然不认为每个客户端都需要一个服务器。就像您最初的方法一样,让每个客户机建立到服务器的套接字连接,然后保持连接打开。让服务器跟踪连接的设备,然后它可以随时向任何连接的设备发送所需的任何数据。我尝试过这样做,它会触发连接事件并保持在那里,但当我从服务器发送包时,不会触发SOCKET_数据事件。可能我遗漏了什么…添加了一个示例,展示了设置套接字连接的基本原理,该连接正在等待服务器发送数据。您提到的方法就是我尝试使用的方法,但我猜可能我的问题出在服务器上,而不是客户机上。在这里你可以下载我的C#服务器:另外,你可以发布你的服务器代码吗?