2012-01-01 49 views
0

我正在使用BufferedReader#readLine()从TCP/IP套接字获取文本行。从带有不一致行终止符的java套接字读取行

在同一个会话中,我的服务器有时会发送以\ r \ n结尾的行,有时它会发送仅以\ n结尾的行。

此行为不是我的控制:(

为的readLine()的Javadoc说下:

“A线被认为是由(换行的任一项'\ n为终止“),回车(” \ r')或回车一个换行符紧跟。”

不幸的是,这似乎并没有工作(至少在Windows上),它只是‘知道’阅读以\ r \ n结尾的行。

有什么建议吗?

在此先感谢, 阿德里安。

+1

你的代码一定有问题,因为它肯定有效。执行以下代码:'String test =“first \ nsecond \ irdird \ r \ nfourth”; BufferedReader br = new BufferedReader(new StringReader(test)); 弦线; ((line = br.readLine())!= null){System.out.println(line); }' – 2012-01-01 16:14:05

+0

你的意思是,如果你只接收换行,在Windows上,readline不能正确识别它们? – 2012-01-01 16:16:40

+0

@Rob HYes。 readLine()永远挂起,或者如果套接字有一个定义的超时,然后抛出SocketTimeoutException:( – 2012-01-01 17:18:50

回答

1

写一个简单的socket客户端和针对netcat的服务器进行测试。 问题是netcat服务器总是以UTF-8发送,客户端不能指望UTF-16。

下面是客户端代码:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.net.UnknownHostException; 

public class LineReader { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     if (args.length < 2) { 
      System.out.println("usage: java LineReader charset url"); 
      System.exit(1); 
     } 

     try { 
      final String charset = args[0]; 
      final URI url = new URI(args[1]); 
      final String host = url.getHost(); 
      final int port = url.getPort(); 
      final Socket socket = new Socket(host, port); 
      final BufferedReader reader = new BufferedReader(
        new InputStreamReader(socket.getInputStream(), charset)); 
      while (true) { 
       final String line = reader.readLine(); 
       System.out.println(line); 
      } 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

底线:没有与ReadLine方法没有任何问题。

0

尝试使用垫层OS的line.separator特性:可以按如下步骤去做:

static final String lineSeparator = System.getProperty ("line.separator"); 
+0

我的客户端总是在Windows上运行,所以line.separator肯定是\ r \ n。问题是服务器有时会发送\ r \ n并且有时会发送\ n。您可以通过运行nc -lp 2000(在Windows上使用cygwin)来尝试这种方式,在这种情况下,nc(netcat)会发送以\ n结尾的行,并且这些行不会被readLine ) – 2012-01-01 17:20:05

+0

我的错误...似乎是一个编码问题,我会在稍后发布答案。 – 2012-01-01 18:07:30