本帖最后由 OptimusMan 于 2011-01-13 18:36:43 编辑

解决方案 »

  1.   

    不需要避免,而是要正常处理异常:java.net.SocketException: socket closed。
    也就是捕捉这个异常,然后以这个异常为信号退出循环,就不会成为问题了。
    你在程序里虽然捕捉了异常,但只是打印了一些信息,等于什么也没做,这就不行了。
      

  2.   

    accept()方法是阻塞方式的。
    也就是说,没有客户端的Socket连接过来,该方法不会返回,后面代码无法运行下去。
    当没有客户端连接过来的时候,无论serverStart变量是true还是false,效果都一样,
    因为accept方法根本就没有返回。想要程序继续运行下去,只能模拟个客户端连接过来才可以。
    如果这时候强行关闭ServerSocket当然要抛出异常了,
    因为,这种操作本身就不符合逻辑。
    你想啊,ServerSocket本身正在监听端口,你却强行关闭套接字,
    就好比,你饭还没吃完呢,就被赶出饭馆,一个样。如果不想这种情况发生,要么,模拟个客户端上来,使accept方法返回;
    要么,采用非阻塞模式的编程方法。最后,编程当然的异常,在固定的某个编程模式当中,几乎是不可避免的,
    我们要做的,其实是,怎样更好的处理这些异常,使得程序更加健壮、完美。