问题描述:程序监听web.xml中配置的某个端口,当不同的客户端同时向程序发出请求,程序卡死
入口类 ServletInit.javapublic class ServletInit implements ServletContextListener {     private  ReceiveThread server;
    
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
 try{
            //ToDoShedule.stop();
 server.stop();
        }catch(Exception ex)
{
         System.out.println(ex.getMessage());
        }
} public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
String port = event.getServletContext().getInitParameter("socketPort");
         server=new ReceiveThread(Integer.parseInt(port),1);
         server.start();
}
}
 然后到ReceiveThread.java
public class ReceiveThread extends Thread {

 private int listenPort;
 private int format_tag = 0;
 
 public ReceiveThread(int listenPort) {        
        this.listenPort=listenPort;
    }
    
 
 public ReceiveThread(int listenPort, int format_tag){
   this.listenPort=listenPort;
        this.format_tag = format_tag;

 }

public void run(){

//MultithreadedRemoteServer server = new MultithreadedRemoteServer(9001,1);
     System.out.println("duo Thread 服务端端口已启动》》》");
        //server.acceptConnections();
    
        try {
            
         SysConfig sc = new SysConfig();
         if(!sc.readConfig6())
         return;
         Logger.log("SYSCONFIG[" + sc.get_bankcode()+"][" + sc.get_businesscode()+"][" +sc.get_usercode()+"]");
        
            ServerSocket server = new ServerSocket(listenPort,50);
           //new add 2012-06-05
          System.out.println("允许客户机连接到服务器,等待客户机请求....");
            Socket incomingConnection = null;
            while(true) {
                incomingConnection = server.accept(); 
                Date date = new Date();
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String datetime = format.format(date);
                System.out.println("datetime:"  + datetime);
                System.out.println("client:" + incomingConnection);
                handleConnection(incomingConnection, sc);
            }
        }  catch(BindException e) {
            Logger.log("邦定端口 "+listenPort + "失败!");
        }  catch(IOException e) {            
            Logger.log("建立套接字IO错误: 端口"+listenPort);        
        }
        System.out.println("等待客户机请求结束....");
}

    //与客户机Socket交互以将客户机所请求的文件的内容发送到客户机    
    public void handleConnection(Socket connectionToHandle) { 
        new Thread(new ConnectionHandler(connectionToHandle)).start();
    }
    
    public void handleConnection(Socket connectionToHandle, SysConfig sc) { 
        new Thread(new ConnectionHandler(connectionToHandle, sc, this.format_tag)).start();
    }}
socket

解决方案 »

  1.   

    我在想是不是需要在ReceiveThread的 while 中加点同步处理
      

  2.   

    假如 我在这个加个 Thread.sleep(500000) 如何? while(true) {                 incomingConnection = server.accept();       Thread.sleep(500000);           Date date = new Date();                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");                 String datetime = format.format(date);                 System.out.println("datetime:"  + datetime);                 System.out.println("client:" + incomingConnection);                 handleConnection(incomingConnection, sc);             } 
      

  3.   

    1 .很多人访问Servlet 时,会不会 都进 public void contextInitialized(ServletContextEvent event) ,如果是这样,第一个人进了没问题,第二个人进了 就会报错,估计是报端口占用
    2. Servlet 的访问本身就是多线程了,你的 ReceiveThread extends Thread  使用了一次,里面客户访问再起一次,嵌套三个线程会不会有死锁  ,个人觉得 ReceiveThread  不需要继承 Thread  
      

  4.   

    刚才格式不行 重发一次 不明白 为什么不能重新编辑
    假如 我在这个加个 Thread.sleep(500000) 如何?while(true) {     
                incomingConnection = server.accept();   
                Thread.sleep(500000);
                Date date = new Date();        
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");                
                String datetime = format.format(date);                 
                handleConnection(incomingConnection, sc);             } 
      

  5.   

    把代码改好了,放到机器上试试呗?不过你那个sleep,会使得当前正在执行的线程等待,会不会影响体验?另外,如果你希望某楼回答你的问题,最好“引用”那楼,再加上你的问题。不然他们看不到提示,就不会再回来看望你了,呵呵~