我设置了socket的超时时间,并用一个Scanner读取Socket数据:
sock.setSoTimeout(5000);
Scanner in = new Scannner(sock.getInputStream());然后主要读取过程是这样的:
try{
  in.nextLine();
}catch(NoSuchElementException ex) {
  ex.printStrack();
}问题是当出现一次读取超时并捕捉到NoSuchElementException 异常之后,下次即使有数据可读了,in.nextLine()也会直接返回null.请问这是为什么,怎么解决呢?

解决方案 »

  1.   

    是不是每次用完socket之后,需要将它close,然后重新new一个,IO相关的对象经常会发生钝化现象,就是说这个对象不是null,却不能像正常的对象那样使用。
    不妨试一下。
      

  2.   

    socket是正常的,只是in.nextLine()不能读取了。
    我曾试过在异常里添加这样的代码:in = Scanner(sock.getInputStream());
    重新new一个Scanner是可以的。
    但是为什么原来的就不行了呢?
      

  3.   

    socket超时之后要重新启用这个socket,
    然后做read操作才有校
      

  4.   

    而打印null的时候,说明server端已经关闭连接了.
    也就是说Server端的socket的输出流已经关闭了.
      

  5.   

    两次getInputStream返回的已经不是同一个对象了吧
      

  6.   

    经过Catch处理器的类应该是自动释放资源的在C里catch处理以后的类是会自动调用析构函数的
    JAVA应该道理也差不多,虽然没有析构函数,但是自动的资源处理还是应该有的