Websocket 和 Perl CGI

4

我在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代码作为“OK”。 我的问题是,如果是这样,我该如何做到这一点呢?
1个回答

3
我知道这已经有些过时了,我之所以来到这里是因为我自己也在寻找答案。最终我通过使用Net::WebSocket::Server找到了答案。
有关如何使用该模块和示例的更多详细信息,请参阅http://search.cpan.org/~topaz/Net-WebSocket-Server-0.003004/lib/Net/WebSocket/Server.pm
基本上,你需要有这段Perl代码来匹配你的JavaScript(从Net::WebSocket::Server的CPAN页面复制并修改):
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接