2015-08-29 24 views
4

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

有了更多的研究,我認爲無論是警告和錯誤是可以避免的。

回答

1

正如我所描述的here,socket.io協議不僅僅是一個WebSocket。只需打開一個WebSocket就行了。

socketConnection似乎甚至不是一個WebSocket,而是一個原始套接字。你沒有收到任何迴應,因爲服務器正在說HTTP並且你還沒有完成發送HTTP請求。

您可能需要一個用於R的socket.io庫,或者從服務器上的socket.io切換。

+0

感謝您的幫助!我對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

+0

@JeromeFroelich如果你使用TCP,你可以使用內置的[net](https://nodejs.org/api/net.html#net_net)模塊。 –

+0

謝謝,你完全正確!我能夠用'net'建立一個服務器,並使用R的'socketConnection'函數來讀取數據。我認爲我的下一步是對'net'做更多的研究,以使服務器對潛在的錯誤更加強大。再次感謝您的幫助! – jeromefroe