我在localhost 上设置了一个socket.io服务器(nodejs)
var io = require('socket.io').listen(8000);
io.sockets.on('connection', function (socket) {
setInterval(function(){
socket.emit("updatedPrice", 100.3);
},2000);
});
我已经在浏览器上测试过了,它运行正常。
但是,如果我不能在Matlab 上读取数据
>> tcpipClient = tcpip('localhost',8000,'NetworkRole','Client')
TCPIP Object : TCPIP-localhost
Communication Settings
RemotePort: 8000
RemoteHost: localhost
Terminator: 'LF'
NetworkRole: client
Communication State
Status: closed
RecordStatus: off
Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 0
>> set(tcpipClient,'InputBufferSize',7688);
>> set(tcpipClient,'Timeout',30);
>> fopen(tcpipClient);
>> rawData = fread(tcpipClient,961,'double');
Warning: Unsuccessful read: The specified amount of data was not returned
within the Timeout period.
这可能是在重复一个老问题,但这是我一开始不理解的东西,所以希望它能对其他人有所帮助。
当你说"我已经在浏览器上测试过了,它工作正常"时,我假设你使用了客户端socket.io库。这就是socket.io的工作方式,据我所知,这也是它工作的唯一方式。这是因为socket.io是一个相对高级的库,通过向多个网络套接字等进行广播,为网络提供了很多功能。值得注意的是,socket.io默认情况下甚至不使用网络套接字,它根据可用性"升级"到网络套接字,同时能够回退到较旧的解决方案,如长轮询(https://en.wikipedia.org/wiki/Socket.IO)。Websockets本身是一个很可能通过tcp/ip协议实现的协议,但除非您专门实现socket.io对Websockets的使用,否则matlab中的tcp/ip函数不可能与socket.io通信。即使你可以,这也会很混乱,而且工作量远远超过它的价值。
对于matlab和node之间的通信,我的建议是根据您的预期用途,坚持使用tcp/ip协议或websockets协议。Matlab通过外部代码具有websockets兼容性(https://www.mathworks.com/matlabcentral/fileexchange/50040-jebej-matlabwebsocket),node的npm将为您提供通过tcp/ip或websocket进行通信的模块。