我想用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