用R连接到socket.io套接字

jer*_*roe 5 sockets r node.js socket.io

我正在尝试使用R函数socketConnection()连接到R中的socket.io套接字。但是,尽管我能够正确设置套接字,但无法将数据从套接字读取到R中。

我用来设置服务器的javascript代码是:

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(8005);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  setInterval(function() {
    socket.emit('update', "test")
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)

index.html的代码是:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost:8005');
  socket.on('update', function (data) {
    console.log(data);
  });
</script>
Run Code Online (Sandbox Code Playgroud)

通过在Web浏览器中转到localhost:8005并打开开发人员控制台,可以在其中看到“测试”记录,从而验证套接字是否确实在工作。但是,当我尝试通过以下方式连接到R中的套接字时:

sock <- socketConnection("localhost", 8005, blocking = FALSE, open = "r")
readLines(sock)
Run Code Online (Sandbox Code Playgroud)

每次运行readLines(sock)时,我都会得到一个空字符向量。我还通过执行以下命令并确实从readLines(sock)获得响应,可以从R中的其他套接字读取信息:

sock <- socketConnection("rstudio.com", 6789, blocking = FALSE, open = "r")
readLines(sock)
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。谢谢!

更新(2015-09-01):

多亏了Aaron Dufour的出色帮助,我才能够调整此网络服务器演示以将数据流式传输到R中。我用于服务器的javascript代码是

var net = require('net');

var server = net.createServer(function(socket) {
    setInterval(function() {
        socket.write('Test\r\n');
        socket.pipe(socket);
    }, 1000)
});

server.listen(1337, '127.0.0.1');
Run Code Online (Sandbox Code Playgroud)

R代码是:

sock <- socketConnection("localhost", 1337, open = "r")
readLines(sock)
close(sock)
Run Code Online (Sandbox Code Playgroud)

warning: possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit.有时,我确实在服务器端收到以下警告readLines(socket)

另外,当我close(socket)在R中运行时,服务器崩溃了,并且出现以下错误:Error: This socket has been ended by the other party

通过其他研究,我认为警告和错误都是可以避免的。

Aar*_*our 2

正如我在这里所描述的,socket.io 协议不仅仅是 WebSocket。仅打开 WebSocket 是行不通的。

socketConnection似乎不是 WebSocket,而是原始套接字。您没有得到任何回报,因为服务器正在使用 HTTP,而您还没有完成发送 HTTP 请求。

您可能需要 R 的 socket.io 库,或者从服务器上的 socket.io 切换出去。