我的代码是这样的:从一个socket中读取数据,Socket appsocket = .....(为一个socket)
InputStream s_in = appsocket.getInputStream();
PrintStream s_out = new PrintStream(appsocket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s_in));s_out.write(); 内容省略掉了 ,就是写入一句话,会返回多行信息接着去读数据while ((contentLine = br.readLine()) != null) {
}读取了所有的内容,也发现读取完了。但是程序一直等在while那里,也就是读完了也不跳出去,然后后台报错,socketreadtimeout,说是读超时了 ,这些流和端口都在finally里正常关闭了的。请高手帮忙看看是什么原因啊,为什么读完了也不返回null,也就不跳出,怎么才能让它读完后跳出while接着执行下面的代码啊!!!!

解决方案 »

  1.   

    socket上i/o要用线程去读取和写,因为i/o是阻塞的。
    所以它会一直在哪里读,不会向下执行,只有用线程分开执行。
      

  2.   

    socket返回NULL只有在对方的socket已经关闭的情况之下你的buffer用的是readline(),如果他没有看到有'\n'出现,那么这一行肯定停留在这个地方。如果有\n出现了,while循环可以继续,但是还是pending直到最后的socket关闭。至于socket read timeout,这个主要和你创建socket用的TIMEOUT和系统的KeepAliveTime有关,你可以通过setTimeOut进行改变。
      

  3.   

    read()、readLine()方法都是阻塞的。没有数据来的时候就等待,有数据才会读取。
    你可以把读到的数据放到队列里去,由另一个处理线程来处理队列中的数据。while ((contentLine = br.readLine()) != null) {
         // contentLine 放入队列}
      

  4.   

    建议申请一个大byte数组 一次把所有的数据都取出来,readline()方法经常会出问题...
      

  5.   

    你这是输入流阻塞,如果你可以设置一个特殊结束字符串,如“end”,可以在while中再判断,
    if(contentLine.equals("end"))
       break;
    或者直接把输出流关闭,如
    OutputStream socketOut = socket.getOutputStream();
    socketOut.write(sb.toString().getBytes());
    socket.shutdownOutput();
    完后再读
      

  6.   


    现在是这样的,我需要对每一行做不同的处理,所以用的readline会方便很多,关键是要在循环结束后还要对结果做处理,也就是用线程也不太好处理,要确保每一行都读完。我现在的想法就是,在while里面把读到的每一行写进一个文件里面,然后捕获超时异常,在catch里面再读取文件里面的内容,不知道这样会不会有问题的
      

  7.   


    不用线程什么的,那你就想7楼所说的,在文件的最后你都加“end”或者其他的字符串表示结束,然后你在while条件里加上“end”条件表示读取文件结束。
    应该可以满足你的需求!
      

  8.   


    关键我要读取的东西也不是确定的,没法加结束符啊,我要读取的是自己写入的一个命令返回的结果,不同设备执行这个命令返回的结果是不一样的,我现在想的就是,在while里面把读到的每一行写进一个文件里面,然后捕获超时异常,在catch里面再读取文件里面的内容,不知道这样会不会有问题的
      

  9.   

    那你就用nio去读取,上网搜下这些资料看看。