我有一个MATLAB程序,需要通过套接字获取CSV文件。我试图无法实际接受任何数据。 MATLAB文档说打开TCP套接字后,你可以调用fscanf(套接字)来获取数据,但总是超时。通过Socket读取ASCII文件到MATLAB
下面是发送文件我的Java代码:
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket s = new Socket("192.168.1.8", 3000);
BufferedReader r = new BufferedReader(new FileReader("./channel1.csv"));
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
String line = null;
int bytes = 0;
while ((line = r.readLine()) != null)
{
System.out.println("Sending:" + line);
out.write(line);
bytes += line.length();
}
System.out.println("Wrote " + bytes + " bytes");
out.close();
s.close();
r.close();
}
运行此打印CSV随着文件:“写2085个字节”
这里是MATLAB代码试图收到的文件:
t=tcpip('192.168.1.6',3000,'NetworkRole','server');
set(t,'InputBufferSize',10000);
fopen(t) %blocks here for connection
data = fscanf(t); %times out here
如果我连接到MATLAB脚本中使用的netcat用命令:
nc 192.168.1.8 3000
一切工作正常,但如果我使用netcat来尝试将文件发送:
cat channel1.csv | nc -v 192.168.1.8 3000
这导致相同的Java程序。
如何在MATLAB中接收ASCII文件?
你确定它在哪里阻塞或超时?当您的Matlab脚本超时时,您看到的错误信息或其他行为是什么?只有一个参数的'fscanf(t)'应该立即出错;至少需要额外的格式参数。如果你在Matlab端使用不受限制的'tcpip('0.0.0.0',...)'表单,会发生什么? –
当然,MATLAB会阻止fopen。根据这个[文档](http://www.mathworks.com/help/instrument/writing-and-reading-data_f16-57447.html#btfksnp),fscanf只能使用一个参数。不受限制的tcpip表单不会改变任何内容,但是它是一种更好的方式。 – Austin
Gotcha;我没有意识到这是'tcpip'对象的另一个'fscanf'签名。根据你链接的doco,我认为可能会发生的事情是'fscanf'不符合它的最终条件:在“读取ASCII数据”下,它表示它将读取直到a)它遇到终结者,b)它填充它的缓冲区,c)它读取指定数量的值。它没有提到引起读取结束的客户端套接字关闭的任何信息;它可以被设计成允许从多个连接收集数据。为了测试这个,试着'fscanf(t,'%c',500)'看看它是否返回一些数据。 –