gpt4 book ai didi

actionscript-3 - AS3类封装导致套接字多次连接

转载 作者:行者123 更新时间:2023-12-03 12:05:22 25 4
gpt4 key购买 nike

当使用flash.net.Socket类连接到远程服务器时,遇到了一种奇怪的情况。当直接在Flash Professional层的代码空间中编写套接字时,可以建立持久连接,并且只能为ONCE建立持久连接。但是,如果我将连接逻辑包装到一个类中,则该类实例将不断创建疯狂的NEW套接字。

所以这是我在独立运行套接字时的代码:

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

这是类中带有套接字的代码:
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代码层中运行:
import com.example.MockSession;

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

这会产生一堆“套接字连接”的消息...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
Connected to socket...
......

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

最佳答案

您的代码似乎还不错。
但要特别确定的是:

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

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

    关于actionscript-3 - AS3类封装导致套接字多次连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23540815/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com