2013-11-23 21 views
4

我正在嘗試Socket.IO和Perl的Mojolicious。雖然我能夠執行相同的WebSockets我試圖做到這一點與Socket.IO(由於更廣泛的瀏覽器支持,我需要)它沒有發揮好。Perl Mojolicious&Socket.IO打不好

我正在使用Morbo服務器。的代碼是:

#!/usr/bin/env perl 
use Mojolicious::Lite; 

get '/' => sub { 
    my $self = shift; 

    $self->render('index'); 
}; 

websocket '/echo' => sub { 
    my $self  = shift; 
    state $counter = 1; 

    $self->res->headers->header('Access-Control-Allow-Origin' => "*"); 
    Mojo::IOLoop->recurring(1.5 => sub { 
      my $loop = shift; 
      $self->send(sprintf("Websocket request: %d\n",$counter++)); 

    }); 
}; 

app->start; 

__DATA__ 
@@ index.html.ep 
<!DOCTYPE html> 
<html> 
    <head> 
    <title>Socket.IO test</title> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script> 
    </head> 
    <body> 
    <div id="dumper"></div> 
<script> 
    var ws = new WebSocket('<%= url_for('echo')->to_abs %>'); 

    ws.onmessage = function(e) { 
     var message = e.data; 
     console.log(message); 
     $("#dumper").text(message); 
    }; 
// var socket = io.connect('<%= url_for('echo')->to_abs %>'); 
// socket.on('data', function (data) { 
// console.log(data); 
// }); 
</script> 


    </body> 
</html> 

此代碼部分工作阱(的WebSocket),當我取消對Socket.IO部分,它放在io.connect(...)與以下錯誤失敗(頁眉和響應):

請求:

GET /socket.io/1/?t=1385234823089 HTTP/1.1 
Host: 127.0.0.1:3000 
Connection: keep-alive 
Cache-Control: max-age=0 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 
Accept: */* 
Referer: http://127.0.0.1:3000/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

響應:

HTTP/1.1 404 Not Found 
Connection: keep-alive 
Content-Type: text/html;charset=UTF-8 
Date: Sat, 23 Nov 2013 19:27:03 GMT 
Content-Length: 6163 
Server: Mojolicious (Perl) 

我從客戶獲得在使用的WebSocket請求是這樣的:

GET ws://127.0.0.1:3000/echo HTTP/1.1 
Pragma: no-cache 
Origin: http://127.0.0.1:3000 
Host: 127.0.0.1:3000 
Sec-WebSocket-Key: zgob5gss5XTr9vzYwYNe+A== 
Upgrade: websocket 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 
Cache-Control: no-cache 
Connection: Upgrade 
Sec-WebSocket-Version: 13 

似乎Socket.IO套接字doenst請求升級? 此外,魔咒不知道這條路的:

/socket.io/1 

我也試過更換:

io.connect('<%= url_for('echo')->to_abs %>'); 

io.connect('http://localhost:300/echo');

回答

1

它看起來對我來說,從CDN文件是從一個請求文件你的服務器應該來自cdn。我的猜測是有額外的配置需要。

0

我認爲socket.io是一個節點應用程序。我一直不得不使用stock websocket API來開發我的mojo應用程序。