2014-04-21 67 views
0

我有一个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文件?

+0

你确定它在哪里阻塞或超时?当您的Matlab脚本超时时,您看到的错误信息或其他行为是什么?只有一个参数的'fscanf(t)'应该立即出错;至少需要额外的格式参数。如果你在Matlab端使用不受限制的'tcpip('0.0.0.0',...)'表单,会发生什么? –

+0

当然,MATLAB会阻止fopen。根据这个[文档](http://www.mathworks.com/help/instrument/writing-and-reading-data_f16-57447.html#btfksnp),fscanf只能使用一个参数。不受限制的tcpip表单不会改变任何内容,但是它是一种更好的方式。 – Austin

+0

Gotcha;我没有意识到这是'tcpip'对象的另一个'fscanf'签名。根据你链接的doco,我认为可能会发生的事情是'fscanf'不符合它的最终条件:在“读取ASCII数据”下,它表示它将读取直到a)它遇到终结者,b)它填充它的缓冲区,c)它读取指定数量的值。它没有提到引起读取结束的客户端套接字关闭的任何信息;它可以被设计成允许从多个连接收集数据。为了测试这个,试着'fscanf(t,'%c',500)'看看它是否返回一些数据。 –

回答

0

我想通了。上面的MATLAB代码起作用,我在Java中添加了一行,以在每次写入之后刷新缓冲区,并且它工作正常!所以我的Java代码如下。我不确定为什么冲洗缓冲区有帮助。它似乎是MATLAB一次从Java解析多行的东西?

 public static void main(String[] args) throws UnknownHostException, IOException 
     { 
      log("Hello World!"); 

      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; 
      int i = 0; 
      while (true) 
       { 
        line = ++i + "," + Math.sin(Math.toRadians((double) i)); 

        System.out.println("Sending:" + line); 
        out.write(line + "\n"); 
        out.flush(); 
        bytes += line.length(

       } 
     } 

感谢Andrew Janke的帮助!

+0

它看起来像冲洗缓冲区不是唯一的变化。您还正在写出正在写入的行的“+”\ n“',这实际上可能会修复它。 Java的'BufferedReader.readLine()',如在原始示例中的'((line = r.readLine())!= null)',去掉行尾字符。所以我认为原始的Java代码实际上是在写一个大的非终止行(因为它在实际套接字上使用'write()'而不是'println()'),而Matlab的'fscanf'正在寻找一个\ n从不出现的EOL。尝试在原始代码中添加一个“+”\ n“'来确认? –

+0

(因为无论是否显式调用'flush()',关闭要写入的套接字时缓冲区都应刷新。) –