2015-08-29 20 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