繁体   English   中英

Flex套接字和循环

[英]Flex Sockets and Looping

好的,这里。

在我的网络上,我有几台PC都运行一个定制的服务器,它将返回查询时登录的用户名。

我有以下代码。

private function LoopAndList():void
        {
            var loopSocket:Socket;
            var fourthOctet:Number = 6;
            var stubIP:String = "192.168.0.";
            var loophost:String;

            loopSocket = new Socket();
            loopSocket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
            loopSocket.addEventListener(Event.CONNECT, connectHandler);
            loopSocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            loopSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            textarea1.text = "";

            while (fourthOctet != 0)
            {

                loophost = stubIP + fourthOctet;
                textarea1.text = textarea1.text + loophost + "\n";
                textarea1.text = textarea1.text + "Connecting to: " + loophost + "\n"; 
                try
                {
                loopSocket.connect("192.168.0.4", 19001);
                fourthOctet--;
                }
                catch(ioError:IOError)
                {
                    textarea1.text = textarea1.text + "Sec error \n ";
                    fourthOctet--;
                }
                catch(secError:SecurityError)
                {

                    textarea1.text = textarea1.text + "io error \n";
                    fourthOctet--;
                }

现在,当它运行时它不能像我最初想的那样工作。 迭代过去了。 第四个字节值减少。 但是有些奇怪的事情发生了。 您将在上面的代码中注意到我在循环中有一个硬编码的IP地址。 我把它放在那里,以确保始终有一个有效的连接。 所以我知道它将始终连接到192.168.0.4。

但是连接只发生在最后一次连接呼叫上。

输出是:

192.168.0.6
Connecting to 192.168.0.6
192.168.0.5
Connecting to 192.168.0.5
...
192.168.0.1
Connecting to 192.168.0.1
Sending Data
IN REad function
data received
username/192.168.0.1

在那里我希望所有人都能快乐地连接和奔跑。 有没有人对这个失败的地方有任何想法?

看起来你不明白Socket.connect()是异步的。 因此,执行循环和修改文本并不是您所想的,因为您没有在该循环中连接。 调用connect()后,它立即返回,而不是等待连接到主机。 您应该修改connctHandler回调中的文本区域,因为只有在那一点上才真正连接。 您的错误处理也是如此。 您可能没有看到响应,因为服务器可能没有打开,或者忙,超时等。首先返回的服务器可能是活动服务器,其他服务器不存在,无法访问,网络错误,等等。 基本上他们的连接将超过30秒等待响应。

你的问题缺少意图。 您正在尝试完成什么,因为代码正在执行您要求它执行的操作。 为什么你这样做还不清楚。

基本上它都是异步的,你的输出不会像这样干净:

Connected to 1, here is what I sent to 1, here is 1 told me
Connect to 2, here is what I sent to host 2, here is what host 2 told me
Connect 3, etc. 

它将全部并行发生,并且当每个主机和网络响应允许时,请求和响应将返回。 所以它们都会聚集在一起。 您可以修改代码以对其进行序列化,但是您必须将connect()调用链接到回调中最后一个连接的响应的末尾。 狡猾,但可行。

如果您尝试与至少一个服务器建立连接,那么您将需要执行类似于我所描述的内容。 如果出现问题,请尝试1,尝试2等。但是您必须从回调中启动下一个connect()调用。 你写的并不是同步的。

OK这是我提出的解决方案,包括计时器,计数器和一系列值。 我在启动时使用循环预填充数组。

var timer:Timer = new Timer(1000, 4);

            textarea1.text = "";
            loopSocket = new Socket();

            timer.start();
            timer.addEventListener(TimerEvent.TIMER, bogoffflex);

            function bogoffflex():void
            {
                textarea1.text = textarea1.text + "Timer fired " + count +  "\n";
                textarea1.text = textarea1.text + loopSockArr[count] + "\n";
                loopSocket.addEventListener(Event.CONNECT, onConnect);
                loopSocket.addEventListener(Event.CLOSE, onClose);
                loopSocket.addEventListener(ProgressEvent.SOCKET_DATA, recvdata);
                try
                {
                //loopSocket.timeout = 1000;
                loopSocket.connect(loopSockArr[count] , 19001);
                count ++;
                }

结果,比我想要的慢一点但是可以接受。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM