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

标签 actionscript-3 sockets air serversocket

我设法创建了一个 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_DATA
仅此而已。就像我想要的那样工作。
然而,flash.net.ServerSocket与移动设备不兼容,但...

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

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

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

最佳答案

是的。您的客户端应该通过 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

关于actionscript-3 - 在不使用服务器套接字的情况下监听 AS3 (AIR) 客户端中的传入连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949672/

相关文章:

flash - ActionScript 属性 - 公共(public) Getter, protected Setter

flash - AS3 Sound.extract() 需要帮助

Java:确定 TCP 套接字何时变慢并重新建立连接

apache-flex - 在 flex/air 中使用 ssl 调用具有不受信任证书的 Web 服务

ios - 应用程序已批准 - 等待开发人员发布 - 目前在您所在的国家/地区不可用

actionscript-3 - 如何消除声音

apache-flex - 在 TextArea 中实现撤消/重做

node.js - Nodejs集群socket.io nginx配置

c - TCP 套接字,服务器无法响应客户端,接受 : Interrupted system call

ios - AIR 模块 + iOS