客户端运行后,怎么老是不释放资源啊!!导致我多运行2个程序就出被阻塞了!!public class MultiThreadServer {
private int port = 8821;
private ServerSocket serverSocket;
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 10;// 单个CPU线程池大小 public MultiThreadServer() throws IOException {
serverSocket = new ServerSocket(port);
// Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors()
* POOL_SIZE);
System.out.println("服务器启动");
} public void service() {
while (true) {
Socket socket = null;
try {
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}public class Handler implements Runnable {
private Socket socket; public Handler(Socket socket) {
this.socket = socket;
} private PrintWriter getPrintWriter(Socket s) throws Exception {
OutputStream out = s.getOutputStream();
return new PrintWriter(out, true); } private BufferedReader getBufferedReader(Socket s) throws Exception {
InputStream is = s.getInputStream();
return new BufferedReader(new InputStreamReader(is));
} public String echo(String str) {
return "echo:" + str;
} public void run() {
try {
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br=null;
PrintWriter pw=null;
try {
br = getBufferedReader(socket);
pw = getPrintWriter(socket);
} catch (Exception e) {
e.printStackTrace();
}
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
}
pw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}public class MultiThreadClient { public static void main(String[] args) {
int numTasks = 10; ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
} } // 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port = 8821; public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes()); // 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null){
System.out.println(msg);
}
br.close();
socketOut.close();
System.out.println("123");
socket.close();
System.out.println("321");
} catch (IOException e) {
e.printStackTrace();
}
} };
}
}

解决方案 »

  1.   

    在你的creatTask方法中的try-catch块后加个finally,将关闭的操作放在里面试试
      

  2.   

    有两种可能:
    1,服务器没有给客户端返回任何消息,导致你的客户端在
    while ((msg = br.readLine()) != null){
    readLine一直在等待服务段的信息,因为你没有设置超时,
    所以没有消息就会阻塞。2,可能是在你的
    socket.close();
    之前,出现了异常,所以没有执行的。这个你可以通过
    finally来解决。
      

  3.   

    Socket的timeout方法如下:
    socket.setSoTimeout(100); 
    100ms之内收不到服务器段消息就timeout
    当然你要捕捉timeout异常,然后把socket.close掉。
      

  4.   

    加了也没用,,
    我是2cpu的机器.先运行MultiThreadServer
    然后运行3次MultiThreadClient,前面2次都能收到服务器返回的  this is Server come back string(但是好像socket没有关闭)..
    导致第三次socket请求后..服务器不能返回信息..也没见有异常出现!!
      

  5.   

    可能是while的结束条件没达到,所以一直在等待服务器端的消息你不要用null用其他结束条件试试
      

  6.   

    谁能给个客户端发送一段文字..服务器收到并且打印..
    然后服务器将一段文字发送回客户端,..客户端打印
    然后客户端关闭...的socket程序!!
    我写了很多..都不行..
    不知道是哪有问题!!!
      

  7.   

    你写了调试代码:
    System.out.println("123");
    socket.close();
    System.out.println("321");你说前两次没有关闭,是不是确实没有
    123
    321
    这种信息输出啊?还是输出来了,你还感觉没有关闭。
    如果上面的信息每次都输出,那应该没有问题的
      

  8.   

    java2000.net 里面的 IO和网络编程板块有很多这样的代码!
      

  9.   

    别用reader的实现类来读,用stream才可以,readLine()方法只能读取最后为\n的数据,如果socket的双方发送数据,最后不包含\n,则最后一行必然阻塞。
      

  10.   

    确实是这个原因...
    但是如果我要发送byte[] 的信息了?
    怎么判断结尾了?