socket 线程 同步问题 求助大侠(急)

tjzero_sapce 2013-05-15 04:03:09
问题描述:程序监听web.xml中配置的某个端口,当不同的客户端同时向程序发出请求,程序卡死
入口类 ServletInit.java
public 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();
}

}
...全文
107 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lujianfu 2013-05-16
  • 打赏
  • 举报
回复
1 .很多人访问Servlet 时,会不会 都进 public void contextInitialized(ServletContextEvent event) ,如果是这样,第一个人进了没问题,第二个人进了 就会报错,估计是报端口占用 2. Servlet 的访问本身就是多线程了,你的 ReceiveThread extends Thread 使用了一次,里面客户访问再起一次,嵌套三个线程会不会有死锁 ,个人觉得 ReceiveThread 不需要继承 Thread
tjzero_sapce 2013-05-16
  • 打赏
  • 举报
回复
假如 我在这个加个 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);                 System.out.println("datetime:"  + datetime);                 System.out.println("client:" + incomingConnection);                 handleConnection(incomingConnection, sc);             } 
oh_Maxy 2013-05-16
  • 打赏
  • 举报
回复
引用 6 楼 tjzero_sapce 的回复:
刚才格式不行 重发一次 不明白 为什么不能重新编辑 假如 我在这个加个 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);             } 
把代码改好了,放到机器上试试呗?不过你那个sleep,会使得当前正在执行的线程等待,会不会影响体验? 另外,如果你希望某楼回答你的问题,最好“引用”那楼,再加上你的问题。不然他们看不到提示,就不会再回来看望你了,呵呵~
f893147944 2013-05-16
  • 打赏
  • 举报
回复
while(true) {
tjzero_sapce 2013-05-16
  • 打赏
  • 举报
回复
刚才格式不行 重发一次 不明白 为什么不能重新编辑 假如 我在这个加个 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);             } 
tjzero_sapce 2013-05-15
  • 打赏
  • 举报
回复
我在想是不是需要在ReceiveThread的 while 中加点同步处理
tjzero_sapce 2013-05-15
  • 打赏
  • 举报
回复
这个异常出现在生产机上,我本地的测试环境模拟不了...
rumlee 2013-05-15
  • 打赏
  • 举报
回复
咋一看没有发现有什么问题,建议调试一下看看是在哪里卡死了。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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