首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3类封装导致套接字多次连接

AS3类封装导致套接字多次连接
EN

Stack Overflow用户
提问于 2014-05-08 11:44:55
回答 1查看 268关注 0票数 1

当使用flash.net.Socket类连接到远程服务器时,我遇到了一个奇怪的情况。当直接在层的代码空间中编写套接字时,可以建立持久连接,并且只能建立一次。但是,如果我将连接逻辑封装到一个类中,类实例就会像疯狂一样不断地创建新的套接字。

因此,下面是运行套接字独立时的代码:

代码语言:javascript
复制
var host:String = 'xx.xx.xx.xx';
var port:Number = 123456;
trace("host:"+host);
trace("port:"+port);

if (true){
    var socket:Socket = new Socket(host, port);
    socket.addEventListener(Event.CONNECT, onConnect);
    socket.addEventListener(Event.CLOSE, onClose);
    socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);

    function onConnect(e:Event):void {
        trace("Connected to socket...");
        Log.info("Connected to socket...");
    }

    function onClose(e:Event):void {
        // Security error is thrown if this line is excluded
        trace("Closing socket...");
        Log.info("Closing socket...");
        socket.close();
    }

    function onError(e:IOErrorEvent):void {
        trace("IO Error: "+e);
        Log.info("IO Error: "+e);
    }

    function onSecError(e:SecurityErrorEvent):void {
        trace("Security Error: "+e);
        Log.info("Security Error: "+e);
    }

    function onResponse(e:ProgressEvent):void {
        if (socket.bytesAvailable>0) {
            var res:String = socket.readUTFBytes(socket.bytesAvailable);
            trace(res);
            Log.info(res);
        }
    }
}

下面是类中带有套接字的代码:

代码语言:javascript
复制
package com.example {
    import flash.net.Socket;
    import flash.events.*;

    import com.example.utils.Log;

    public class MockSession {
        private var socket:Socket;

        public function MockSession(host:String,port:Number):void{
            socket = new Socket(host,port);
            socket.addEventListener(Event.CONNECT, onConnect);
            socket.addEventListener(Event.CLOSE, onClose);
            socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
            socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);
        }

        private function onConnect(e:Event):void {
            trace("Connected to socket...");
            Log.info("Connected to socket...");
        }

        private function onClose(e:Event):void {
            // Security error is thrown if this line is excluded
            trace("Closing socket...");
            Log.info("Closing socket...");
            socket.close();
        }

        private function onError(e:IOErrorEvent):void {
            trace("IO Error: "+e);
            Log.info("IO Error: "+e);
        }

        private function onSecError(e:SecurityErrorEvent):void {
            trace("Security Error: "+e);
            Log.info("Security Error: "+e);
        }

        private function onResponse(e:ProgressEvent):void {
            if (socket.bytesAvailable>0) {
                var res:String = socket.readUTFBytes(socket.bytesAvailable);
                trace(res);
                Log.info(res);
            }
        }
    }
}

以及它如何在Flash代码层中运行:

代码语言:javascript
复制
import com.example.MockSession;

var session2:MockSession = new MockSession('xx.xx.xx.xx', 123456);

这会产生一堆“套接字连接”味精.

代码语言:javascript
复制
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
......

我不知道使用类有什么不同。有谁可以帮我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 15:54:58

你的代码似乎没问题。但要特别确定的是:

  • 在onConnect()处理函数中,为连接添加removeEventListener -这样,您将确保触发事件的不是套接字的同一个实例。您可以在onClose()侦听器上重新添加侦听器。
  • 在MockSession类的构造函数或onConnect()函数中添加一个断点,并在调试模式下运行该应用程序。这样,每次执行该行时,您都会暂停应用程序,您将看到堆栈--是什么导致了该行的执行。也许您会注意到有多个套接字正在打开,或者有一个条件可以再次创建它。

最后,您可以向MockSession类中添加一个单例条目,以确保始终只有一个实例(当然,如果您不打算一次打开多个套接字)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23540815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档