【问题标题】:Websocket and Perl CGIWebsocket 和 Perl CGI
【发布时间】:2014-09-06 18:47:20
【问题描述】:

我在 CGI 编程方面有点新手,我正在尝试制作在线聊天 API,但遇到不少麻烦:

我在网上寻找解决方案,发现客户端 (js) 的 Websocket 和 perl 的 HTTP::Daemon,但我不知道从哪里开始让服务器监听来自浏览器的连接。

这是我的 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,但 Websocket 正在等待 101 代码为“OK”。

我的问题是,如果是这样,我怎样才能做到这一点?

【问题讨论】:

    标签: javascript perl websocket


    【解决方案1】:

    我知道这已经过时了,我来到这里是因为我自己也在寻找答案。我最终通过使用 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;
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多