Websocket и Perl CGI

1

Я немного новичок в программировании CGI, и я пытаюсь сделать онлайн-чат-API, но сталкиваюсь с небольшими проблемами:

Я искал онлайн решение и нашел Websocket для клиента (js) и HTTP :: Daemon для perl, но я не знаю, с чего начать сервер слушать соединения из браузера.

Вот мой код JavaScript:

ws = new WebSocket('ws://www.crazygao.com:3000'); // test
ws.onopen = function() {
    alert('Connection is established!'); // test
};
ws.onclose = function() {
    alert('Connection is closed'); 
};
ws.onmessage = function(e) {
    var message = e.data;
    //alert('Got new message: ' + message);
};
ws.onerror = function(e) {
    //var message = e.data;
    alert('Error: ' + e);
};

Вот мой тестовый код скрипта Perl:

use HTTP::Daemon;
use HTTP::Status;

my $d = HTTP::Daemon->new(
    LocalAddr => 'www.crazygao.com',
    LocalPort => 3000
) || die; print "Please contact me at: <URL:", $d->url, ">\n";
while(my $c = $d->accept) {
    $c->send_response("1"); # test
    while (my $r = $c->get_request) {
        if ($r->method eq 'GET') {
            $c->send_response("...");
        }
    }
    $c->close;
    undef($c);
}

Когда страница загружается, соединение немедленно закрывается, а в окне консоли Chrome я вижу следующую ошибку: соединение с WebSocket с "ws://198.38.89.14: 3000/" не выполнено: ошибка в установлении соединения: net :: ERR_CONNECTION_REFUSED

Я запускаю скрипт perl вручную (используя простой вызов http://example.com/cgi-bin/xxx.cgi), а затем, когда я обновляю страницу, которую я получаю: соединение с WebSocket с 'ws://198.38.89.14: 3000/'не удалось: Ошибка при рукопожатии WebSocket: неожиданный код ответа: 200

Я понимаю, что сервер нормально возвращает 200, когда OK, но Websocket ожидает 101 кода как "ОК".

Мой вопрос, если да, как я могу это достичь?

Теги:
websocket

1 ответ

2
Лучший ответ

Я знаю, что это уже давно, и я пришел сюда, потому что сам искал ответ. В итоге я нашел ответ, используя Net :: WebSocket :: Server.

http://search.cpan.org/~topaz/Net-WebSocket-Server-0.003004/lib/Net/WebSocket/Server.pm для получения более подробной информации о том, как использовать модуль и пример.

В принципе, этот код Perl будет соответствовать вашему javascript (скопированному и измененному на странице CPAN Net :: WebSocket :: Server):

use Net::WebSocket::Server;

my $origin = 'http://www.crazygao.com';

Net::WebSocket::Server->new(
    listen => 3000,
    on_connect => sub {
        my ($serv, $conn) = @_;
        $conn->on(
            handshake => sub {
                my ($conn, $handshake) = @_;
                $conn->disconnect() unless $handshake->req->origin eq $origin;
            },
            utf8 => sub {
                my ($conn, $msg) = @_;
                $_->send_utf8($msg) for $conn->server->connections;
            },
            binary => sub {
                my ($conn, $msg) = @_;
                $_->send_binary($msg) for $conn->server->connections;
            },
        );
    },
)->start;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню