我试图尝试使用Socket.IO和Perl的MojolicIoUs.虽然我能够使用WebSockets执行相同的操作,但我尝试使用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(…)上失败并出现以下错误(Header和Response):
请求:
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请求套接字升级吗?
此外,Mojo不知道这条路线:
/socket.io/1
我也尝试过更换:
io.connect('<%= url_for('echo')->to_abs %>');
使用io.connect(‘http:// localhost:300 / echo’);