我正在尝试使用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>
我能够通过在我的网络浏览器中访问localhost:8005并打开Developer's Console来验证套接字是否确实正常工作,我可以在其中看到“test”被记录。但是,当我尝试通过以下方式连接到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)
当我运行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
通过进一步的研究,我认为警告和错误都是可以预防的。
答案 0 :(得分:1)
正如我所描述的here,socket.io协议不仅仅是一个WebSocket。只是打开一个WebSocket是行不通的。
但是socketConnection
似乎甚至不是WebSocket,而是一个原始套接字。你没有得到任何回报,因为服务器正在谈论HTTP而你还没有完成发送HTTP请求。
您可能需要一个用于R的socket.io库,或者从服务器上的socket.io切换。