在public class Listener extends Thread {...} 中1>生成ServerSocket侦听对象
ServerSocket  listener = new ServerSocket(this.port,maxConn);2>  侦听线程运行函数 (线程优先级为7)
  public void run() {      while(!stop_flag) {
          try {
                client = listener.accept();                System.out.println(this.service);                addConnection(client,runService);          } catch (Exception e) {
              e.printStackTrace();
              Date today = new Date();
              System.out.println(today);
          }
      }
      try {
          client.close();
      } catch (IOException e) {
             e.printStackTrace();
      }
  }3>收到连接后唤醒工作线程队列
        synchronized (pools) {
            pools.add(pools.size(), socket);
            pools.notify();
        }
4>工作线程工作(线程优先级为5)public void run() {
        while (true) {
            synchronized (pools) {
                while (pools.isEmpty()) {
                    try {
                        pools.wait();
                    } catch (InterruptedException e) {
                        log.println(e.getMessage());
                    }
                }                //获得第一个有效的Socket连接
                socket = (Socket) pools.remove(0);
                //加入服务连接
                server.addConnections(socket);
                //当前连接数增加
                checkOut++;
            }
            synchronized (this) {
                handleConnection(socket, s);
            }
        }
    }5>具体工作函数 public void handleConnection(Socket socket, Service s) {
        try {
            socket.setSoTimeout(20000);            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();            //调用相应的应用服务
            //读取数据,进行处理,并输出数据.最后 in.close ;  out.close;
            s.serve(in, out);        } catch (IOException e) {
              
            e.printStackTrace();
            Date today = new Date();
            System.out.println(today + " ---  handleConnection");
        }        //取消服务中的socket连接,并且关闭soclet
        server.removeConnections(socket);
        //当前连接数减少
        checkOut--;
    }
}
出现奇怪现象:                StringBuffer buf = new StringBuffer();                try {
                    //连接能够成功
                    socket = new Socket("服务器的IP", iport);                    //in,out也能正常获得
                    in = socket.getInputStream();
                    out = new PrintWriter(socket.getOutputStream(), true);                       
                    long timeStart = System.currentTimeMillis();
                    
                    //数据输出也正确  
                    out.print(ls_message);
                    out.flush();                    String line;     
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
               
                    //出现错误,客户端就停在这了  
                    line = reader.readLine();       // 读取第一行                                               out.close();
                    in.close();                socket.close();            } catch (IOException e)
            {
               e.printStackTrace();
            } 侦听线程:public void run() {      while(!stop_flag) {
          try {
               System.out.println("begin###########################");
                //客户端连接正常,但是线程就停在这不往下运行了
                client = listener.accept();
                
                //不打印提示信息 
                System.out.println(this.service);                addConnection(client,runService);          } catch (Exception e) {
              e.printStackTrace();
              Date today = new Date();
              System.out.println(today);
          }
      }请大家指点一下!!!  

解决方案 »

  1.   

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    is 是个什么东东,应该是in 吧
      

  2.   

    To fuzhe(令狐虫)  
       BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    上面这一段是在一个其他函数里的in作为参数传给is的
      
     
      

  3.   

    to cuilichen(fjfjfjfj) 
    〉既然线程是停在那里了,那么说明程序就没有收到任何连接,它一直在监听通讯。
    > 检查一下服务器的确输出了吗?问题是我的客户端代码:
                        socket = new Socket("服务器的IP", iport);
                        //in,out也能正常获得
                        in = socket.getInputStream();
                        out = new PrintWriter(socket.getOutputStream(), true);                      
                        long timeStart = System.currentTimeMillis();                  
                        //数据输出也正确  
                        out.print(ls_message);
                        out.flush();
                        String line;     
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                   
                        //出现错误,客户端就停在这了  
                        line = reader.readLine()但是服务器却没有反应。如果连不上的话,客户端应该不能网下运行,应该出错呀!正常应该一运行:socket = new Socket("服务器的IP", iport);  服务器就应该响应呀!
      

  4.   

    感觉应该是你的addConnection有问题,不见得是在停在System.out.println(this.service);
      

  5.   

    如果是addConnection有问题,System.out.println(this.service);也应该运行,显示提示信息呀//Listener 的addConnection函数调用ConnectionHandler类的静态方法
    private synchronized void addConnection(Socket s, Service service) {
          ConnectionHandler.requestToHandler(s, service);
      }//ConnectionHandler类
    import java.io.*;
    import java.net.*;
    import java.util.*;public class ConnectionHandler implements Runnable {    private Socket socket;                         //当前的socket对象
        private static List pools = new LinkedList();  //连接服务列表
        private PrintWriter log = new PrintWriter(System.err, true);  //显示提示信息对象
        private static int checkOut = 0;          //当前连接数
        private static Service s;                  //应用服务
        private Server server;                      //连接所在的服务
        private static boolean stop_flag = false; //是否停止标志    public ConnectionHandler(Server server) {
            this.server = server;
        }    public void run() {
            while (true) {
                synchronized (pools) {
                    while (pools.isEmpty()) {
                        try {
                            pools.wait();
                            // log.println("线程" + Thread.currentThread().getName() + "接收连接......");
                        } catch (InterruptedException e) {
                            log.println(e.getMessage());
                        }
                    }                //获得第一个有效的Socket连接
                    socket = (Socket) pools.remove(0);
                    //加入服务连接
                    server.addConnections(socket);
                    //当前连接数增加
                    checkOut++;
                }
                synchronized (this) {
                    handleConnection(socket, s);
                }
            }
        }    public static void requestToHandler(Socket socket, Service service) {
            s = service;
    //     System.out.println("####################");
    //      System.out.println("请求连接");
            synchronized (pools) {
                pools.add(pools.size(), socket);
                pools.notifyAll();
            }
        }    public static int getCurrentConnections() {
            return checkOut;
        }    public void handleConnection(Socket socket, Service s) {
            try {
                String ip;            socket.setSoTimeout(10000);            //获得输入输出对象
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();
                //调用相应的应用服务
                s.serve(in, out);            System.out.println("**********************************");        } catch (IOException e) {
                e.printStackTrace();
                Date today = new Date();
                System.out.println(today + " ---  handleConnection");
            }        //取消服务中的socket连接
            server.removeConnections(socket);
            //当前连接数减少
            checkOut--;
        }
    }
      

  6.   

    是不是下面这段有问题?
    synchronized (this) {
                    handleConnection(socket, s);
                }
      

  7.   

    别费劲了,看nio吧,比这种方式好多了。
      

  8.   

    马上就要用的服务程序,可不敢用完全不了解的NIO方式.
      

  9.   

    //出现错误,客户端就停在这了  
    line = reader.readLine()
    ====================
    是很正常的现象,因为reader试图readLine()
    但是由于流中没有内容,所以IO就会阻塞在这里,
    出现这种情况的原因就是服务器没有响应客户端的请求(或者是没有收到请求)。
      

  10.   

    问题是之后再用其他客户端去连接服务程序,服务程序也没有响应。
    下面的代码不自再运行,正常情况下客户端运行socket = new Socket("服务器的IP", iport);服务段就会运行下面的代码。
    System.out.println(this.service);
    addConnection(client,runService);同时服务程序停在了
    client = listener.accept();
      

  11.   

    不好意思打扰一下:
    有兴趣一边上网一边赚钱吗?,赚的还是美元呢。
    您想轻松做兼职,超过自己的薪水!!
    这绝对是真实的,cctv-10都报道了它的可信性!
    特别是上班时能上网的朋友,只要能上网就能赚钱,不用你费心
    详情请登陆http://freemoneycn.home4u.china.com/
    立即注册http://www.cashfiesta.com/php/join.php?ref=freemoneynj