1.SocketServer等待客户端连接
package com.hiaward.xtranssvc.socket;import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;public class SocketServer extends HttpServlet { final static int PORT = 8765;

public void init() throws ServletException {
    Thread t = new Thread(new Runnable() {
ServerSocket server = null;
public void run() {

BufferedReader in = null;
PrintWriter out = null;
try {
server = new ServerSocket(PORT);
Socket socket = null;
HandlerExecutorPool executorPool = new HandlerExecutorPool(50, 1000);

try {
while(true){
socket = server.accept();
executorPool.execute(new ServerHandler(socket));
}

} catch (Exception ex) {
System.out.println("---"+ex);
}


} catch (Exception e) {
e.printStackTrace();
System.out.println("---"+e);
} finally {
if(in != null){
try {
in.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
if(out != null){
try {
out.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
if(server != null){
try {
server.close();
} catch (Exception e3) {
e3.printStackTrace();
}
}
server = null;
}
}
});
t.start();


}

}
2.客户端连接后,进行处理,能接收到请求,但是消息必须要客户端断开后才能收到消息
package com.hiaward.xtranssvc.socket;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;import com.hiaward.xtranssvc.database.TermDb;
import com.hiaward.xtranssvc.entity.Term;
import com.hiaward.xtranssvc.socket.SocketToTerm;
public class ServerHandler implements Runnable { private Socket socket;
public ServerHandler (Socket socket){
this.socket = socket;
}

public void run() {
System.out.println("run");
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream(), true);
String body = null;
while(true){
System.out.println("body = in.readLine()前");
body = in.readLine();
System.out.println("body = in.readLine()后body=" + body);
if(body == null){
System.out.println("null" );
break;

//将信息在页面显示
out.print("1");
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(in != null){
try {
in.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
if(out != null){
try {
out.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (Exception e3) {
e3.printStackTrace();
}
}
socket = null;
}


}}
求大神看看

解决方案 »

  1.   

    socket通信代码看起来不会造成你描述的问题,你的HandlerExecutorPool线程池实现贴出来看下吧 感觉最可能是这里造成的
      

  2.   

    大神您看下是线程池的问题么package com.hiaward.xtranssvc.socket;import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;public class HandlerExecutorPool { private ExecutorService executor;
    public HandlerExecutorPool(int maxPoolSize, int queueSize){
    this.executor = new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors(),
    maxPoolSize, 
    120L, 
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(queueSize));
    }

    public void execute(Runnable task){
    this.executor.execute(task);
    }



    }
      

  3.   

    你线程池实现也没问题。你客户端是怎么写的?你的handler里面是用的BufferedReader.readLine来读取的 客户端在写消息的时候有带换行吗?
      

  4.   

    readline 接受换行   \n  时不会阻塞