使用R连接到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); }); 

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来validation套接字确实正在工作,并打开Developer Console,在那里我可以看到“test”被logging。 但是,当我尝试通过以下方式连接到R中的套接字:

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

每次我运行readLines(袜子)我得到一个空的字符向量。 我也确认我可以通过执行以下命令从readLines(sock)中得到响应,从R中的其他套接字读取:

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

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

UPDATE(2015-09-01):

感谢Aaron Dufour的出色帮助,我能够使这个networking服务器演示程序将数据stream式传输到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) 

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

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

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

正如我在这里所描述的,socket.io协议远不止一个WebSocket。 只要打开一个WebSocket就行不通了。

socketConnection似乎甚至不是一个WebSocket,而是一个原始的套接字。 你没有得到任何回报,因为服务器正在说HTTP,你还没有完成发送HTTP请求。

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