你的主线程的while(true)循环中没有捕获异常。如果new Server2(serverSocket.accept()).start()出现异常,就导致主线程挂起。   出现异常后,可以关了重来

解决方案 »

  1.   

    有点明白了
    不过你所说的while循环中的异常是不是有2种可能?
    (1)accept()发生异常;
    (2)start()发生异常;
    我是否要一一进行捕捉?另:
    (1)在子线程发生的异常是不是应该不会影响到主线程序?
    (2)如何确保主线程不挂起?
      

  2.   

    给你贴一段代码:
    try{
        server=new ServerSocket(port,2);
        sgui.appendMsg ("聊天室服务器启动完毕!");
        while(true){
          socket=server.accept();
          clientAddress=socket.getInetAddress().getHostAddress();
          out=new PrintWriter(socket.getOutputStream(),true); //打开数据通道
          in=new LineNumberReader(new InputStreamReader(socket.getInputStream()));      int number=getClientNumber(); //取得用户号
          if(number==-1){ //登录人数限制
            //out.println("_LOGINFAILED*&现在已有太多的用户在线了,请待会儿再登录。"); //错误提示
            networkClose(); //关闭网络连接
          }else{
            clientThread[number]=new ClientThread(this,clientAddress);
            this.sgui.appendMsg(clientAddress+"已成功连接服务器!用户号:"+number);
          }
        }
        }catch(Exception e){ //出现任何异常都不中断网络
          e.printStackTrace(ChatServer.writeErrorLog ());
        }
      

  3.   

    我可能要改下列一段,哪位高手帮我加加
    while(listening)
    {
      new Server2(serverSocket.accept()).start();
    }
    serverSocket.close();
      

  4.   

    呵呵,sorry,上面的代码好像错了,应该把try{...}catch(Exception e){
    }写在while(true)里面.这样无论出现了什么错误,循环一直都会运行,这样就可以保证服务器24小时运行了.
      

  5.   

    网络的关闭由捕捉人自己去关闭,好处是非常明显的。如果我只是超时,超时后我要进行处理其它的网络事件,那你怎么办?
         在catch中关闭网络。
      

  6.   

    谢谢大家,我已加上TRY{}捕捉异常了。
    不过程序已经运行了38小时,还未出现异常(未挂起),我在catch{}中将异常写入一个临时文件,不知是否恰当?听说JDK1.4有个日志类,我还看不懂如何做,只好把异常写入临时文件,随机给一个文件名了,呵呵。
    看了很多书,都是说把异常System.out.println(...)这样,不过对于这种常驻后台的程序不合适。该怎么办?