java.net.ServerSocket server = new java.net.ServerSocket(port);
java.net.Socket client = null;
while(true){
  client = server.accept();
  new ThreadDeal(client).start();
}以上是我程序中的代码的一部分,此段代码是放在一个线程的run函数里面的,功能就是创建一个socket服务,监听一个端口,如果接受到请求之后,将调用一个处理线程处理,监听线程继续监听,但现在要求要实现一个服务停止,重启的功能,我不知道这个停止该如何实现,如果直接在另外的线程中调用server.close();的话,server.accept还是处于挂起的状态,如果调用server.close()后,accept能够立马往下执行过去,或者抛出一个异常就好了,不知道各位兄弟姐妹以前有没有实现过这种功能的,帮帮小弟了,急等。

解决方案 »

  1.   

    java.net.ServerSocket server = new java.net.ServerSocket(port);
    java.net.Socket client = null;
    while(true){                           //while(flag){
      client = server.accept();
      new ThreadDeal(client).start();
    }
    ...............
    setFlag(false);
      

  2.   

    很简单,
    设置一个外部调用线程(有run函数和调用此服务的线程)和此服务控制程序都能共享的内存变量,服务控制程序直接操作这个变量,来控制服务的运行/停止状态
    比如该变量为,定义在ServiceControl类中:
    public static boolean RUNNING = false;
    ....
    java.net.ServerSocket server = new java.net.ServerSocket(port);
    java.net.Socket client = null;
    while(ServiceControl.RUNNING ){
      client = server.accept();
      new ThreadDeal(client).start();
    }
      

  3.   

    感谢你们的支持,楼上两位说的这种方法我自然知道,只是不能达到我的要求啊,因为当线程在client=server.accept();这一行挂起的时候,既然把flag或者是running之类的一个标志设置后也不会立马就会有反应的,因为要等下一个循环才会判断的。
      

  4.   

    那你就要把这个标志作为参数传递到server侧啦,很明显,是否挂起不是由client决定而是由server侧决定的
      

  5.   

    看来我火星了,都不知道accept不会因为close而抛出异常。
    看来没什么好办法了?
      

  6.   

    close之后抛出异常,只有在下次客户端连接服务器的时候才会抛出异常的,而不是close之后立马就抛出异常的。我测试过了。
      

  7.   

    你也可以用setSoTimeout 设置超时时间 然后用循环进行检查
      

  8.   

    强烈建议使用JDK1.4带的非阻塞IO做服务器
      

  9.   

    to:Clerk_9919(Clerk),其实我现在就是采用这个方法的,但是不知道有没有比这个更加一些的方法。
      

  10.   

    我的测试结果和你的不同,close之后立刻抛出了异常java.net.SocketException: socket closed
      

  11.   

    我测试过了,accept阻塞的过程中,如果close调用了,那么accept立即抛出异常;至于其它的用于通信的Socket对象,只能一个一个的断开了。
    楼主是不是关闭错了Socket了?