Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблемы с Perl-сокетом (http://www.flasher.ru/forum/showthread.php?t=109352)

Онтожка 12.03.2008 21:45

Проблемы с Perl-сокетом
 
Значит, нашёл в интернете код для сокет-сервера на Perl:

PHP код:

 # This is an XMLSocket multiuser server, for use with Flash 5
        # If you don't know what XMLSocket is, you shouldn't be using
        # this program.  

        
use IO::Socket;
        use 
IO::Select;

        
# Set the input terminator to a zero byte string, pursuant to the
        # protocol in the flash documentation.
        
$/ = "\0";
        
        
# Create a new socket, on port 7777
        
$lsn = new IO::Socket::INET(Listen => 1
                                    
LocalPort => 7777,
                                    
Reuse => 1,
                                    
Proto => 'tcp' )
           or die (
"Couldn't start server: $!");

        
# Create an IO::Select handler
        
$sel = new IO::Select($lsn);

        
# Close filehandles

        
close(STDIN); close(STDOUT);

        
warn "Server ready.  Waiting for connections . . . \n";

        
# Enter into while loop, listening to the handles that are available.
        
while( @read_ready $sel->can_read ) {

            foreach 
$fh (@read_ready) {
                
# Create a new socket
                
if($fh == $lsn) {
                    
$new $lsn->accept;
                    
$sel->add($new);
                    
push( @datafileno($new) . " has joined.");
                    
warn "Connection from " $new->peerhost ".\n";
                }

                
# Handle connection
                
else {
                    
$input = <$fh>;
                    
                    
chomp $input;
                    if ( 
$input eq '') {
                        
push( @datafileno($fh) . " has left.");
                        
warn "Disconnection from " $new->peerhost ".\n";                
                        
$sel->remove($fh);
                        
$fh->close;
                    }
                    else {
                        
$output fileno($fh) . ": $input";
                        
push( @data$output );

                    }
                }

            }

            
# Write to the clients that are available
            
foreach $fh ( @write_ready $sel->can_write(0) ) {
                foreach 
$line (@data) {
                    print 
$fh "$line \0";
                }
            }
                
            
undef @data;

        }

        
warn "Server ended.\n"

При тестировании из Flash IDE сервер работает нормально, то есть в консоли выводятся такие сообщения:

Connection from 127.0.0.1 -- при подключении
Disconnection from 127.0.0.1 -- при отключении


Если же тестировать из браузеров то вывод будет таким:

Connection from 127.0.0.1 -- при подключении
Disconnection from 127.0.0.1
Connection from 127.0.0.1

Disconnection from 127.0.0.1 -- при отключении


То есть сокет подключается, сразу же отключается, а потом опять подключается... В этом собственно вопрос - почему так происходит и как это исправить?

LinuxVideo 13.03.2008 00:22

Прибить аутпост, это один из его глюков
Если его нет, то смотреть трафик

Онтожка 01.04.2008 02:21

Проблема решена, это всё из-за новых секьюрити-фич девятого плеера (редиски эти адобы, редиски! ;).

По сути: при подключении хмл-сокет требует policy-файл с настройками о том, каким доменам и на какие порты можно коннектиться, но требует не просто там ссылку на policy-файл, а хочет чтобы ему сожержимое этого policy-файла по сокетному же соединению и передали, после этого сокетное соединение в любом случае закрывается (отсюда это connect-disconnect-connect), а далее флэш-плеер уже смотрит по policy-файлу - можно ли подсоединяться с указанными параметрами или нет.


В общем проблему можно решить двумя способами - либо настроить сокет-сервер так, что он будет с начала отрабатывать policy-запрос, а потом уже работать в нормальном режиме, либо нужно делать 2 соект-сервера, которые работают на 2 разных потрах (1-й просто возвращает policy-файл, второй - нормальный сокет-сервер), потом флэш-плееру дать указание грузить policy-файл с одного порта, а коннектиться уже к другому, вот так:

Код:

System.security.loadPolicyFile("xmlsocket://www.site.com:2000");
socket.connect('www.site.com', 2001);



Часовой пояс GMT +4, время: 12:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.