客户端发送的消息后,客户端必须断开重新连接,服务器才能收到信息

chengiqdsad 2017-09-20 12:01:22
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;
}


}

}
求大神看看
...全文
722 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
洋葱味甜甜圈 2019-07-16
  • 打赏
  • 举报
回复 1
readline 接受换行 \n 时不会阻塞
pilnyun335857183 2017-09-21
  • 打赏
  • 举报
回复
你线程池实现也没问题。你客户端是怎么写的?你的handler里面是用的BufferedReader.readLine来读取的 客户端在写消息的时候有带换行吗?
chengiqdsad 2017-09-20
  • 打赏
  • 举报
回复
大神您看下是线程池的问题么 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); } }
pilnyun335857183 2017-09-20
  • 打赏
  • 举报
回复
socket通信代码看起来不会造成你描述的问题,你的HandlerExecutorPool线程池实现贴出来看下吧 感觉最可能是这里造成的

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧