问题描述:程序监听web.xml中配置的某个端口,当不同的客户端同时向程序发出请求,程序卡死
入口类 ServletInit.javapublic class ServletInit implements ServletContextListener { private ReceiveThread server;
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
try{
//ToDoShedule.stop();
server.stop();
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}
} public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
String port = event.getServletContext().getInitParameter("socketPort");
server=new ReceiveThread(Integer.parseInt(port),1);
server.start();
}
}
然后到ReceiveThread.java
public class ReceiveThread extends Thread {
private int listenPort;
private int format_tag = 0;
public ReceiveThread(int listenPort) {
this.listenPort=listenPort;
}
public ReceiveThread(int listenPort, int format_tag){
this.listenPort=listenPort;
this.format_tag = format_tag;
}
public void run(){
//MultithreadedRemoteServer server = new MultithreadedRemoteServer(9001,1);
System.out.println("duo Thread 服务端端口已启动》》》");
//server.acceptConnections();
try {
SysConfig sc = new SysConfig();
if(!sc.readConfig6())
return;
Logger.log("SYSCONFIG[" + sc.get_bankcode()+"][" + sc.get_businesscode()+"][" +sc.get_usercode()+"]");
ServerSocket server = new ServerSocket(listenPort,50);
//new add 2012-06-05
System.out.println("允许客户机连接到服务器,等待客户机请求....");
Socket incomingConnection = null;
while(true) {
incomingConnection = server.accept();
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String datetime = format.format(date);
System.out.println("datetime:" + datetime);
System.out.println("client:" + incomingConnection);
handleConnection(incomingConnection, sc);
}
} catch(BindException e) {
Logger.log("邦定端口 "+listenPort + "失败!");
} catch(IOException e) {
Logger.log("建立套接字IO错误: 端口"+listenPort);
}
System.out.println("等待客户机请求结束....");
}
//与客户机Socket交互以将客户机所请求的文件的内容发送到客户机
public void handleConnection(Socket connectionToHandle) {
new Thread(new ConnectionHandler(connectionToHandle)).start();
}
public void handleConnection(Socket connectionToHandle, SysConfig sc) {
new Thread(new ConnectionHandler(connectionToHandle, sc, this.format_tag)).start();
}}
socket
入口类 ServletInit.javapublic class ServletInit implements ServletContextListener { private ReceiveThread server;
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
try{
//ToDoShedule.stop();
server.stop();
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}
} public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
String port = event.getServletContext().getInitParameter("socketPort");
server=new ReceiveThread(Integer.parseInt(port),1);
server.start();
}
}
然后到ReceiveThread.java
public class ReceiveThread extends Thread {
private int listenPort;
private int format_tag = 0;
public ReceiveThread(int listenPort) {
this.listenPort=listenPort;
}
public ReceiveThread(int listenPort, int format_tag){
this.listenPort=listenPort;
this.format_tag = format_tag;
}
public void run(){
//MultithreadedRemoteServer server = new MultithreadedRemoteServer(9001,1);
System.out.println("duo Thread 服务端端口已启动》》》");
//server.acceptConnections();
try {
SysConfig sc = new SysConfig();
if(!sc.readConfig6())
return;
Logger.log("SYSCONFIG[" + sc.get_bankcode()+"][" + sc.get_businesscode()+"][" +sc.get_usercode()+"]");
ServerSocket server = new ServerSocket(listenPort,50);
//new add 2012-06-05
System.out.println("允许客户机连接到服务器,等待客户机请求....");
Socket incomingConnection = null;
while(true) {
incomingConnection = server.accept();
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String datetime = format.format(date);
System.out.println("datetime:" + datetime);
System.out.println("client:" + incomingConnection);
handleConnection(incomingConnection, sc);
}
} catch(BindException e) {
Logger.log("邦定端口 "+listenPort + "失败!");
} catch(IOException e) {
Logger.log("建立套接字IO错误: 端口"+listenPort);
}
System.out.println("等待客户机请求结束....");
}
//与客户机Socket交互以将客户机所请求的文件的内容发送到客户机
public void handleConnection(Socket connectionToHandle) {
new Thread(new ConnectionHandler(connectionToHandle)).start();
}
public void handleConnection(Socket connectionToHandle, SysConfig sc) {
new Thread(new ConnectionHandler(connectionToHandle, sc, this.format_tag)).start();
}}
socket
2. Servlet 的访问本身就是多线程了,你的 ReceiveThread extends Thread 使用了一次,里面客户访问再起一次,嵌套三个线程会不会有死锁 ,个人觉得 ReceiveThread 不需要继承 Thread
假如 我在这个加个 Thread.sleep(500000) 如何?while(true) {
incomingConnection = server.accept();
Thread.sleep(500000);
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String datetime = format.format(date);
handleConnection(incomingConnection, sc); }