我想用R函数socketConnection()连接到R中的socket.io socket。然而,尽管我能够正确设置插座,我无法从它的数据读入R.用R连接socket.io socket 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>
我能够确认插座确实是打算到本地主机的工作:8005在我的网页浏览器,开放的开发者控制台,在那里我可以看到“测试”未登入。然而,当我尝试连接到插座R:
sock <- socketConnection("localhost", 8005, blocking = FALSE, open = "r")
readLines(sock)
我每次运行readlines方法(袜子)我得到一个空的字符向量回来。我也证实了我可以从其他插槽R中通过执行以下的确正从readlines方法的响应(袜子)阅读:
sock <- socketConnection("rstudio.com", 6789, blocking = FALSE, open = "r")
readLines(sock)
任何帮助将不胜感激。谢谢!
更新(2015年9月1日):
由于亚伦·杜福尔优秀的帮助,我能够适应这个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
有了更多的研究,我认为无论是警告和错误是可以避免的。
感谢您的帮助!我对socket.io客户端做了一些更多的研究,并找到了能够连接到socket.io并接收到的python库[socketIO-client](https://github.com/invisibleroads/socketIO-client)数据在python中。我想我可以查看源代码来尝试在R中做同样的事情。另外,还有一个npm模块[raw-socket](https://www.npmjs.com/package/raw-socket)用于实现原始套接字,它可能会像你所建议的那样替换服务器上的socket.io。 – jeromefroe
@JeromeFroelich如果你使用TCP,你可以使用内置的[net](https://nodejs.org/api/net.html#net_net)模块。 –
谢谢,你完全正确!我能够用'net'建立一个服务器,并使用R的'socketConnection'函数来读取数据。我认为我的下一步是对'net'做更多的研究,以使服务器对潜在的错误更加强大。再次感谢您的帮助! – jeromefroe