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

时间:2012-12-19 09:55:19

标签: actionscript-3 sockets air serversocket

我设法创建了一个使用sockets将文件发送到AS3(AIR)客户端的C#服务器。在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_DATA

接收数据

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

所以这是我的问题:我需要从C#服务器(需要侦听客户端,因此我可以创建一个连接设备列表)向AS3(AIR)客户端发送文件,但我必须定义哪个客户端正在获取服务器上的数据,客户端需要随时准备接收数据,因此,监听,但有很多,这就是我认为它们作为客户端的原因。

我的问题是:有没有办法让客户端监听传入的连接并在事件发生时触发事件,而不使用AS3中的服务器套接字?

此外,如果你有不同的方法来实现我的目标,而不使用C#服务器< - > AS3客户端/服务器逻辑,请随时提出您的意见。

1 个答案:

答案 0 :(得分:6)

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

编辑:

以下是客户端使用Socket持续侦听来自服务器的消息的快速示例。这将连接到服务器,然后(无限期地)等待数据。当收到一大块数据时(在这种情况下,我希望字符串以新行字符终止),数据将与事件一起传递。

如果您尝试此方法但未成功,则应查看是否存在任何错误或连接是否已关闭。

文档类:

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

SocketTest类:

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

SocketMessageEvent类:

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