Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> клиент-сервер. серверная часть perl, клиент: javascript websocket 
V
    Опции темы
Bulat
Дата 5.7.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



На стороне клиента простой html, javascript и websocket. Например:
Код

function WebSocketTest()
{
  if ("WebSocket" in window)
  {
     alert("WebSocket is supported by your Browser!");
     // Let us open a web socket
     var ws = new WebSocket("ws://localhost:9998/echo");
     ws.onopen = function()
     {
        // Web Socket is connected, send data using send()
        ws.send("Message to send");
        alert("Message is sent...");
     };
     ws.onmessage = function (evt) 
     { 
        var received_msg = evt.data;
        alert("Message is received...");
     };
     ws.onclose = function()
     { 
        // websocket is closed.
        alert("Connection is closed..."); 
     };
  }
  else
  {
     // The browser doesn't support WebSocket
     alert("WebSocket NOT supported by your Browser!");
  }
}

WebSocketTest();


Очень хотелось бы посмотреть тривиальную реализацию сервера на перл. Желательно через бифы(socket).


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 6.7.2013, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Вот что я имею на данный момент, если более подробно:

test.html:

Код

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
        <script type="text/javascript">
        </script>
        <table border="0" cellpadding="2" cellspacing="2" width="100%">
            <tr>
                <td align="center">
                    <script type="text/javascript">

function WebSocketTest()
{
  if ("WebSocket" in window)
  {
     alert("WebSocket is supported by your Browser!");
     // Let us open a web socket
     var ws = new WebSocket("ws://localhost:8888/");
     ws.onopen = function()
     {
        // Web Socket is connected, send data using send()
        ws.send("Message to send");
        alert("Message is sent...");
     };
     ws.onmessage = function (evt) 
     { 
        var received_msg = evt.data;
        alert("Message is received...");
     };
     ws.onclose = function()
     { 
        // websocket is closed.
        alert("Connection is closed..."); 
     };
  }
  else
  {
     // The browser doesn't support WebSocket
     alert("WebSocket NOT supported by your Browser!");
  }
}

WebSocketTest();

                        </script>
                </td>
            </tr>
        </table>
    </body>
</html>


websocket_server.pl :

Код

#!/usr/bin/perl

use strict;

use IO::Socket::INET;
use IO::Select;
use Carp;

my $Port = 8888;

my $Listen = IO::Socket::INET->new(
    Listen    => 5,
    LocalPort => $Port,
    Proto     => 'tcp',
    ReuseAddr => 1,
) or croak "failed to listen on port $Port: $!";

my $Select = IO::Select->new($Listen);

while ($Select -> count) {
    my @ready = $Select -> can_read();

    foreach my $fh (@ready) {
        if ($fh == $Listen) {
            my $sock = $Listen -> accept;

            my ($len, $data) = (0, "");

            $len = sysread($sock, $data, 8192, length($data));

            print $data, "\n";
        } else {
        }
    }
}


В браузере выдает: Connection is closed...

А скрипт пишет заголовок:
Код

GET / HTTP/1.1
Host: localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: sH68KCt1RlVBv4tH8tz8Sg==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket


Помогите докрутиить, а, эту фичу...

Ну идея банально простая... Типичный клиент-сервер..... Тока технически нужно дожать и все...


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Pilat66
Дата 6.7.2013, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.1.2009

Репутация: 1
Всего: 1



Сделайте это с Mojolicious и не мучайтесь.
PM MAIL   Вверх
Bulat
Дата 6.7.2013, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(Pilat66 @  6.7.2013,  09:49 Найти цитируемый пост)
Сделайте это с Mojolicious и не мучайтесь. 


А можно ответтить на вопрос который интересует меня, подчеркиваю?? =)


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 8.7.2013, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



вы с самим протоколом разобрались?
тогда можете посмотреть тут: http://cpansearch.perl.org/src/MIYAGAWA/Tw...ocket/chat.psgi,
достаточно простая реализация.
PM MAIL ICQ   Вверх
Bulat
Дата 8.7.2013, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



arto, ну вот сижу ковыряюсь... по ссылке пока просмотрел по диагонали, но чуть позже гляну подробнее... Вроде как раз в ту сторону что мне и нужно было. smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 9.7.2013, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Код

#!/usr/bin/perl
use strict;

use Socket;
use Carp;

sub logmsg { print "@_ \n" }

my $port = shift || 8888;
my $proto = getprotobyname('tcp');

($port) = $port =~ /^(\d+)$/ or die "invalid port";

socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))   || die "setsockopt:$!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";

my $paddr;

$SIG{CHLD} = \&REAPER;

for ( ; $paddr = accept(Client,Server); close Client) {
    my($port,$iaddr) = sockaddr_in($paddr);
    my $name = gethostbyaddr($iaddr,AF_INET);

    my ($len, $data) = (0, "");

    $len = sysread(Client, $data, 8192, length($data));

    logmsg $data;

    my $Key;

    my $SecretKey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

    if ($data =~ /Sec-WebSocket-Key: (.*?)\r/) {

        my $data = $1.$SecretKey;

        use Digest::SHA1 qw/sha1_base64/;

        $Key = sha1_base64($data);

    }

    my $SendHandshake = "HTTP/1.1 101 Switching Protocols\r\n".
    "Upgrade: websocket\r\n".
    "Connection: Upgrade\r\n".
    "Sec-WebSocket-Accept: $Key\r\n\r\n";

    logmsg $SendHandshake;

    print Client $SendHandshake;
}


Код

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
        <script type="text/javascript">
        </script>
        <table border="0" cellpadding="2" cellspacing="2" width="100%">
            <tr>
                <td align="center">
                    <script type="text/javascript">

function WebSocketTest()
{
  if ("WebSocket" in window)
  {
     alert("WebSocket is supported by your Browser!");
     // Let us open a web socket
     var ws = new WebSocket("ws://localhost:8888");
     ws.onopen = function()
     {
        //Web Socket is connected, send data using send()
                alert("Message is sent...");
        ws.send("Message to send");
     };

     //alert(ws.readyState);

     //ws.send('meaasge');

     ws.onmessage = function (evt) 
     { 
        var received_msg = evt.data;
        alert("Message is received...");
     };

     ws.onclose = function()
     { 
         //websocket is closed.
        alert("Connection is closed..."); 
     };
  }
  else
  {
     // The browser doesn't support WebSocket
     alert("WebSocket NOT supported by your Browser!");
  }
}

WebSocketTest();

                        </script>
                </td>
            </tr>
        </table>
    </body>
</html>


Вот, что я имею на данный момент, но onopen все равно не срабатывает....

Пробовал по-разному ответный хендшейк формировать, но пока так успеха и не добился... В чем проблема - не вижу!


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 10.7.2013, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



onopen -- это javascript?
PM MAIL ICQ   Вверх
Bulat
Дата 10.7.2013, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(arto @  10.7.2013,  06:46 Найти цитируемый пост)
onopen -- это javascript? 


Угу.

В приведеннем мною примере javascript выводит два сообщения. Сначала

WebSocket is supported by your Browser!

потом

Connection is closed...

А хочется чтоб хотя бы раз написал

Message is sent...


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 10.7.2013, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



порты открыты?
PM MAIL ICQ   Вверх
Bulat
Дата 10.7.2013, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(arto @  10.7.2013,  08:38 Найти цитируемый пост)
порты открыты? 

само собой.
От клиента(javascript) я хендшейк-то получаю. А вот ответный хендшейк почему-то не срабатывает

Код

GET / HTTP/1.1
Host: localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: bPrv+i5TCC1vR/tObh8wCw==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket


HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: SL2qAawt3BX3DYVcQvXWOgB3DWE



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 12.7.2013, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



проблема решена, пример реально работающего хендшейка:
Код

my $SendHandshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n".
"Upgrade: WebSocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $Key=\r\n".
"\r\n";


Недочеты заключается:
1. в рфс описывается Switching Protocols, а нужно на самом деле Web Socket Protocol Handshake
2. При формировании ответного ключа необходимо дополнять символом '=', и действительно в примерах так оно и укаано, а в описании я об этом ничего не нашел
3. Символы переноса строик и возврата каретки. И здесь тоже изначально трактуется как бы само собой разумеющееся, однако были сомнения, потому что нигде конкретно это не описывается


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 12.7.2013, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1. RFC 6455 1.2.  Protocol Overview: The protocol has two parts: a handshake and the data transfer.

2. RFC 6455 1.2.  Protocol Overview: The handshake from the server looks as follows:

        HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
        Sec-WebSocket-Protocol: chat

3. RFC 2616 2.2 Basic Rules: HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all protocol elements except the entity-body.


"читайте документацию -- она рулез" (ц) чей-то
PM MAIL ICQ   Вверх
Bulat
Дата 12.7.2013, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



arto, дословно перевести??

1. Протокол состоит из двух частей: хендшейк и данные
2. Хендшейк от сервера должен выглядить следующим образом(и тут же кстати как раз и неверный хендшейк)

Дальше продолжать??

P.S. Давай не будем устраивать холивар, я в интернете нашел уже несколько статей, подобному моему топику, где разные программисты точно так же описывали с какими трулностями они столкнулись при реализации вебсокеты, жалобы на плохо описанный стандарт есть.

всегда есть куда расти (с)

Это сообщение отредактировал(а) Bulat - 12.7.2013, 14:47


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 13.7.2013, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1. ну. в рфц присутствует описание протокола. или описание handshake там отсутствует?

2. а что там именно неверно?

3. по третьему пункту вопросов, как я понимаю, нет?

пс. дамп хендшейка с http://www.websocket.org/echo.html:
Hypertext Transfer Protocol
    HTTP/1.1 101 Web Socket Protocol Handshake\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 101 Web Socket Protocol Handshake\r\n]
            [Message: HTTP/1.1 101 Web Socket Protocol Handshake\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Version: HTTP/1.1
        Status Code: 101
        Response Phrase: Web Socket Protocol Handshake
    Upgrade: WebSocket\r\n
    Connection: Upgrade\r\n
    Sec-WebSocket-Accept: xO65RkfOOMva29LmSc/tSQML7ak=\r\n
    Server: Kaazing Gateway\r\n
    Date: Sat, 13 Jul 2013 08:14:15 GMT\r\n
    Access-Control-Allow-Origin: http://www.websocket.org\r\n
    Access-Control-Allow-Credentials: true\r\n
    Access-Control-Allow-Headers: content-type\r\n
    Access-Control-Allow-Headers: authorization\r\n
    Access-Control-Allow-Headers: x-websocket-extensions\r\n
    Access-Control-Allow-Headers: x-websocket-version\r\n
    Access-Control-Allow-Headers: x-websocket-protocol\r\n
    \r\n
    [HTTP response 1/1]

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.