你的主线程的while(true)循环中没有捕获异常。如果new Server2(serverSocket.accept()).start()出现异常,就导致主线程挂起。 出现异常后,可以关了重来
解决方案 »
- 大型JAVA应用程序怎么部署在windows平台上使用
- 如何使用jface组件开发有下拉菜单的工具栏?
- 怎样才是死锁?
- 有关Class对象中Class.forName("package.classname")的疑惑?
- SQLServer - 数据库连接问题?请大虾们指点一下
- java中 抽象类和接口应该怎么用?
- 简单struts的校验培植
- 运用While循环撰写出类似"resumption模型"的行为。在这个While循环中反复执行,直到不再掷出异常为止。请问一下,这个程序怎么写啊?
- JDBC使用什么来实现平台无关?(帮忙,我在考试)
- 请各位高手帮助,在下有礼了 我自已写了一类似于画图板的工具,可以选择颜色,线条的宽度,可是我上面画的时侯没有问题,可是一改变IE的大小,或者有一个新的窗口覆盖在这个应用上面,在关闭覆盖的窗口,我所画的图形都不见了,请各个高手帮忙,谢谢!
- 我学了java后,接着应该学哪个编译器,如jbuiler,jdk,还是什么,
- 谁有权限管理方面的资料?
不过你所说的while循环中的异常是不是有2种可能?
(1)accept()发生异常;
(2)start()发生异常;
我是否要一一进行捕捉?另:
(1)在子线程发生的异常是不是应该不会影响到主线程序?
(2)如何确保主线程不挂起?
try{
server=new ServerSocket(port,2);
sgui.appendMsg ("聊天室服务器启动完毕!");
while(true){
socket=server.accept();
clientAddress=socket.getInetAddress().getHostAddress();
out=new PrintWriter(socket.getOutputStream(),true); //打开数据通道
in=new LineNumberReader(new InputStreamReader(socket.getInputStream())); int number=getClientNumber(); //取得用户号
if(number==-1){ //登录人数限制
//out.println("_LOGINFAILED*&现在已有太多的用户在线了,请待会儿再登录。"); //错误提示
networkClose(); //关闭网络连接
}else{
clientThread[number]=new ClientThread(this,clientAddress);
this.sgui.appendMsg(clientAddress+"已成功连接服务器!用户号:"+number);
}
}
}catch(Exception e){ //出现任何异常都不中断网络
e.printStackTrace(ChatServer.writeErrorLog ());
}
while(listening)
{
new Server2(serverSocket.accept()).start();
}
serverSocket.close();
}写在while(true)里面.这样无论出现了什么错误,循环一直都会运行,这样就可以保证服务器24小时运行了.
在catch中关闭网络。
不过程序已经运行了38小时,还未出现异常(未挂起),我在catch{}中将异常写入一个临时文件,不知是否恰当?听说JDK1.4有个日志类,我还看不懂如何做,只好把异常写入临时文件,随机给一个文件名了,呵呵。
看了很多书,都是说把异常System.out.println(...)这样,不过对于这种常驻后台的程序不合适。该怎么办?