当前位置: 代码迷 >> J2SE >> socket 有关问题,纠结!
  详细解决方案

socket 有关问题,纠结!

热度:71   发布时间:2016-04-24 01:57:34.0
socket 问题,纠结!!!
程序故障如下:
服务端
程序启动后 能运行5天(都正常,网络故障,客户端断开后重连继续运行也没问题),
可是运行5天后客户端就全部断开了,自动连接,一连就断开(不断循环此过程了就),不知道怎么回事·
如果是线程问题的话, 怎么每次都是运行5天的样子,挂的时间很规律(一般启动后5天)

Java code
public void run() {    while (true) {        try {            Socket socket = server.accept();            synchronized (SocketDBServer.lock) {                socketMap.put(socket.getInetAddress().toString().substring(1), socket);//保存客户端IP            }            if(AutoMain.switchFlag) {                synchronized (AutoMain.obj) {                    if (socketMap.size() >= BaseConfig.MIN_CONTROLSER_COUNT) {                        AutoMain.switchFlag = false;                        AutoMain.obj.notify();                    }                }            }            SocketDBServerThread dbserver = new SocketDBServerThread(socket);            logger.info("new SocketDBServerThread(socket)");            new Thread(dbserver).start();            logger.info("new Thread(dbserver).start();");        } catch (IOException e) {            logger.error("SocketDBServer.run() server.accept()", e);        }    }}


还有个疑问,程序挂掉后(客户端在不停的连接中...),我在日志中发现 new Thread(dbserver).start(); 执行这句话居然用了5秒
 上面run方法里面 的语句偶尔会出现这种情况(执行一句话要几秒钟),是什么情况会造成执行一句话要这么久?
CPU满了? 内存满了?

唉纠结很久了,有没有经验的朋友 指点下!
而且现在很恶心,我该改了点东西,测试,又测试不出来,非要跑那么就才出问题·



------解决方案--------------------
synchronized (SocketDBServer.lock) {
socketMap.put(socket.getInetAddress().toString().substring(1), socket);//保存客户端IP
}
这句有点吓人,线程会不断的put,消耗大
可以改改 if(!socketMap.get(socket.getInetAddress().toString().substring(1), )){
socketMap.put(socket.getInetAddress().toString().substring(1), socket);//保存客户端IP
}
还有就是
new Thread(dbserver).start();//不知要执行多少次,开启多少线程,消耗可想而知了

------解决方案--------------------
Java code
//线程延时器,比while(true)性能好ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor();ScheduledFuture future = scheduled.scheduleWithFixedDelay(this, 0, 100,TimeUnit.SECONDS);//线程池,可有效管理线程。ExecutorService  executors = new ThreadPoolExecutor(20, 20, 0L,                    TimeUnit.MILLISECONDS,new DefaultedOfferTimeoutBlockingQueue<Runnable>(5, 86400,TimeUnit.SECONDS));executors.execute(new TaskThread());
  相关解决方案