【问题标题】:Connecting to socket.io socket with R使用 R 连接到 socket.io 套接字
【发布时间】:2015-11-23 18:23:41
【问题描述】:

我正在尝试使用 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);
});

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>

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

sock <- socketConnection("localhost", 8005, blocking = FALSE, open = "r")
readLines(sock)

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

sock <- socketConnection("rstudio.com", 6789, blocking = FALSE, open = "r")
readLines(sock)

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

更新(2015-09-01):

感谢 Aaron Dufour 的出色帮助,我能够修改此 net server demo 以将数据流式传输到 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');

R 代码是:

sock <- socketConnection("localhost", 1337, open = "r")
readLines(sock)
close(sock)

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

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

通过进一步研究,我认为警告和错误都是可以预防的。

【问题讨论】:

    标签: r node.js sockets socket.io


    【解决方案1】:

    正如我所描述的here,socket.io 协议不仅仅是一个WebSocket。仅仅打开一个 WebSocket 是行不通的。

    socketConnection 似乎甚至不是 WebSocket,而是原始套接字。因为服务器正在使用 HTTP 而您还没有完成发送 HTTP 请求,所以您什么也得不到。

    您可能需要一个用于 R 的 socket.io 库,或者从服务器上的 socket.io 切换。

    【讨论】:

    • 感谢您的帮助!我对 socket.io 客户端进行了更多研究,发现了 python 库socketIO-client,我可以使用它连接到 socket.io 并在 python 中接收数据。我想我可能会查看源代码以尝试在 R 中做同样的事情。或者,有一个 npm 模块 raw-socket 用于实现原始套接字,它可能会像你建议的那样替换服务器上的 socket.io。跨度>
    • @JeromeFroelich 如果您使用 TCP,则可以使用内置的 net 模块。
    • 谢谢,你完全正确!我能够使用net 设置服务器,并使用R 的socketConnection 函数读取数据。我认为我的下一步是对net 进行更多研究,以使服务器对潜在错误更加健壮。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多