听在AS3客户端传入的连接(AIR)使用内部消除服务器套接字(Listen for incoming

2019-08-04 07:08发布

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

这是如何工作的:
- >我把我的服务器上,它监听客户端(再加上我可以创建连接的设备的清单);
- >我把我的客户端上,它会自动接收数据;

触发事件接收数据在客户端上进行的,也就是说,我只需打开服务器和客户端为ON时,它得到的数据,引发这些事件:

socket.addEventListener(Event.CONNECT, onConnect); -> to connect to the server  
socket.addEventListener(Event.SOCKET_DATA, onDataArrival); -> to receive the data  

现在我想做些不同的事。 我不想触发它在客户端上,我希望服务器要做到这一点,即,我想谈谈我的客户端上,并把在什么客户端将收到的数据在服务器上。

那么,为什么我试图让客户的客户机/服务器? 嗯,因为我的服务器是一台机器,和我的客户是连接服务器XXX移动设备,这是我的方式来做到这一点。

因此,考虑到我刚才说的,我设法创建我的AS3客户端/服务器应用程序,作品就像我想的那样,使用flash.net.ServerSocket库。

首先,我把客户倾听:

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客户端/服务器逻辑,请随时在您看来踢。

Answer 1:

是。 您的客户端应该连接到通过服务器flash.net.Socket ( DOC )或flash.net.XMLSocket ( DOC )。 在大多数情况下,你只需要其中的许多客户端可以连接一台服务器 。 这并不完全清楚为什么你必须在两端服务器?

编辑:

下面是一个客户连续使用来自服务器的消息监听一个简单的例子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


文章来源: Listen for incoming connections in AS3 (AIR) Client whithout using Server Socket