//服务端主类
import java.io.*;
import java.net.*;
import java.util.*;public class PooledRemoteFileServer {
  protected int maxConnections;
  protected int listenPort;
  protected ServerSocket serverSocket;
  public PooledRemoteFileServer(int aListenPort, int maxConnections) {
    //设定端口号和最大连接数
    listenPort = aListenPort;
    this.maxConnections = maxConnections;
  }  //创建一个能够处理待发请求的ServerSocket,并使其接受连接
  public void acceptConnections() {
    try {
      //ServerSocket(端口,待发数)
      //实际存储数:待发数+处理数
      ServerSocket server = new ServerSocket(listenPort, 5);
      Socket incomingConnection = null;
      while (true) {
        incomingConnection = server.accept();
        //System.out.println(incomingConnection);
        handleConnection(incomingConnection);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }  //将连接传入processRequest中进行处理
  protected void handleConnection(Socket connectionToHandle) {
    //System.out.println("*0" + connectionToHandle);
    PooledConnectionHandler.processRequest(connectionToHandle);
  }  //创建N个PooledConnectionHandler并在新Thread中激活
  public void setUpHandlers() {
    for (int i = 0; i < maxConnections; i++) {
      PooledConnectionHandler currentHandler = new PooledConnectionHandler();
      new Thread(currentHandler, "Handler " + i).start();
    }
  }  //一旦有连接,立即进行处理
  public static void main(String args[]) {
    PooledRemoteFileServer server = new PooledRemoteFileServer(8083, 10);
    server.setUpHandlers();
    server.acceptConnections();
  }
}//====================================================//Runnable类
import java.io.*;
import java.net.*;
import java.util.*;public class PooledConnectionHandler
    implements Runnable {
  protected Socket connection;
  protected static List pool = new LinkedList();  public PooledConnectionHandler() {}  public void handleConnection() {
    Random random = new Random();
    int x = random.nextInt(5000);
    try {
      //System.out.println("*2" + connection);
      BufferedReader is = new BufferedReader(new
                    InputStreamReader(connection.
                                      getInputStream()));
      //System.out.println("*3" + connection);
      //System.out.println("***");
      String line = is.readLine().toString();//到这一步就不能执行了
      //System.out.println("接收信息:" + line + "\n");
      try {
        Thread.sleep(x);
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
      PrintWriter os = new PrintWriter(connection.getOutputStream());
      os.println(line);
      os.flush();
      System.out.println("发送信息" + line + "\n");
      os.close();
      is.close();
      //connection.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }  /**
   * 把传入请求添加到池中,并告诉其它正在等待的对象该池已经有一些内容
   * pool是一个 LinkedList,保存等待处理的连接池
   * 确保不能同时修改连接池
   * */
  public static void processRequest(Socket requestToHandle) {
    synchronized (pool) {
      pool.add(pool.size(), requestToHandle);
      pool.notifyAll(); //通知连接池可用,连接池启动
    }
  }  public void run() {
    while (true) {
      synchronized (pool) {
        while (pool.isEmpty()) {
          try {
            pool.wait(); //修改连接池状态为等待
          }
          catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        connection = (Socket) pool.remove(0);
        //System.out.println("*1" + connection);
      }
      handleConnection(); //一旦有一个连接可以使用,便机型处理
    }
  }
}
//=======================================================//客户端测试类
import java.io.*;
import java.net.*;
import java.util.*;public class test {
  public test() {  }  public static void main(String[] args) {
    test t = new test();
    String line = "111";
    String rec;
    try {
      Socket s = new Socket("192.168.0.1", 8083);
      PrintWriter pw = new PrintWriter(s.getOutputStream());
      BufferedReader br = new BufferedReader(new InputStreamReader(
          s.getInputStream()));
      //for (; ; ) {
        
        pw.print(line);
        pw.flush();
        System.out.print("发送:" + line + "\n");
        rec = br.readLine().toString();
        System.out.println("接收:" + rec + "\n");
        br.close();
        pw.close();
        s.close();
      //}
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}//============================
请教:
为什么到Runnable类的String line = is.readLine().toString();就执行不了了,也就是说line无法赋值?
关闭客户端测试后,服务端报错:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at socketpool.PooledConnectionHandler.handleConnection(PooledConnectionHandler.java:29)
at socketpool.PooledConnectionHandler.run(PooledConnectionHandler.java:76)
at java.lang.Thread.run(Thread.java:595)请各位大侠赐教!!!谢谢啦...

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【jayray007】截止到2008-07-18 11:25:24的历史汇总数据(不包括此帖):
    发帖的总数量:6                        发帖的总分数:307                      每贴平均分数:51                       
    回帖的总数量:20                       得分贴总数量:8                        回帖的得分率:40%                      
    结贴的总数量:6                        结贴的总分数:307                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    没看懂   is.readLine()返回的就是一个String   你为什么还要toString()
      

  3.   

    为什么到Runnable类的String line = is.readLine().toString();就执行不了了,也就是说line无法赋值? 
    估计客户端没有发送消息
      

  4.   

    //System.out.println("接收信息:" + line + "\n");你这句打印出什么?
      

  5.   

    4楼:
    System.out.println("接收信息:" + line + "\n"); 
    什么都没打印出来3楼:
    客户端确定发送了信息
    Runnable类中的//System.out.println("***")就是为了测试socket的情况
    BufferedReader is = new BufferedReader(new
                        InputStreamReader(connection.
                                          getInputStream()));
    这个方法也执行了
      

  6.   

    1楼:
    在readline()加一个toString()是没影响的
      

  7.   

    String line = is.readLine().toString();//到这一步就不能执行了
    这个需要放到run里面读的吧
      

  8.   

    郁闷,你接收端用的是readLine方法.可是发送端,发送的信息,却不是一行字符串,也就是说,没有换行符,让人家接收端怎么读一行啊 ?你把那个pw.print(line);改成println(line);就OK了.
      

  9.   

    //客户端测试类
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    public class Test { //public Test() {}  //测试类没必要加 public static void main(String[] args) {
    //Test t = new Test();  //同样必要
    String line = "111";
    String rec;
    try {
    Socket s = new Socket("192.168.0.100", 8083);
    PrintWriter pw = new PrintWriter(s.getOutputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    //for (; ; ) {
    pw.print(line);
    pw.flush();
    System.out.print("发送:" + line + "\n");
    //发完数据要关闭输出浏以告诉服务器端我所有数据都发完了,否则服务器端 readLine() 方法会一直被阻塞
    s.shutdownOutput();
    rec = br.readLine()/*.toString()*/;
    System.out.println("接收:" + rec + "\n");
    br.close();
    pw.close();
    s.close();
    //}
    } catch (Exception e) {
    e.printStackTrace();
    }
    }}