关于JavasocketExcetpion:Connection Reset

bicel1222 2010-07-19 04:52:47
块来帮我啊,大哥大姐们。。
就20分了。分少别见怪啊。
目前的项目中老出现一种错误,那就是 Connection Reset,,
不知道该如何解决。
服务端就是简单的侦听客户端的链接,当有客户端链接,就为客户端起一个线程。然后处理客户端发送过来的数据。
服务器刚开始运行的一段时间是没问题的,能正常的处理客服端发送的信息,但当服务器运行一段时间(<24Hour)就开始有客户端 链接的时候出现上面那个异常,具体位置就在while ((length = ips.read(bytes, 0, 512))!= -1) 这里;
不知道这是为什么,文档上说如果不是因为流位于文件末尾而无法读取第一个字节,则抛出 IOException。特别是,如果输入流已关闭,则抛出 IOException。 这里是IOException..可是异常却是socketException。
read()方法不是阻塞式的吗?没有数据的时候不是一直等待数据的到来吗?
可是有的客户端刚连上就马上出现下面的异常,,实在搞不明白了,希望有知道的大哥大姐们指教一二。下面给出部分代码。
但具体输出的错误为:

java.net.SokcetException:Connection reset
at java.net.SokectInputStream.read(SocketInputStream.java:168)
at com.bjdx.GprsServer.ProSocket.run(ProSocket.java:47)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(TreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(TreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)




//run方法
public void run()

{
try{
int length = 0 ;
byte[] bytes = new byte[512];
while ((length = ips.read(bytes, 0, 512))!= -1) {
String msg = byte2HexStr(bytes,lengh);//把收到的字节处理成16进制串。
ProMsg(msg);//处理数据。
}
}catch(IOException e){
e.printStackTrace();
}

}
//处理字节的方法
public String byte2HexStr(byte[] bytes,int length){...}
//处理消息的方法
public void ProMsg(String msg){....}




...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bicel1222 2010-07-19
  • 打赏
  • 举报
回复
还能再详细点吗? :(
bicel1222 2010-07-19
  • 打赏
  • 举报
回复
下班了,走了。。。
欢迎大家一起讨论。:D
yangxuebao123 2010-07-19
  • 打赏
  • 举报
回复

try {
// 要运行的程序的路径
String message= "D:/create.bat ";
// 运行这个程序的程序
String cmd[]={ "cmd.exe ",message};
// 开始执行
Runtime.getRuntime().exec(cmd);
}
catch (IOException ex) {
ex.printStackTrace();
}


yangxuebao123 2010-07-19
  • 打赏
  • 举报
回复
我用的是多线程并发的,问题不是很大,只要过一个星期自己手动重启一下就行了,大概也并发了几万个进程了。。我是一段时间扫描一下,是个死循环。 打包成jar文件了,然后通过.bat文件运行


前几天,看到别人用java程序可以结束掉.bat文件,也可以开启.bat文件、、、


调用的时候 给窗口命名为name
cmd /c statr "name" java xxxx

程序执行中关闭的话
关掉刚才定义的name的窗口,进程也就被关闭了
cmd /c taskkill /FI "WINDOWTITLE eq name" /IM * /F



command = cmd /c taskkill /FI "WINDOWTITLE eq name" /IM * /F
用Runtime.getRuntime().exec(command);




你说的那个处理线程的方法,我也没办法,可能有些人是用的集群,就是多个服务器,一个断了,还有另外一个。。。
bicel1222 2010-07-19
  • 打赏
  • 举报
回复
我用的线程池。ThreadPoolExecutor
楼上说的有道理,但是线程阻塞该怎么检查出来并处理掉呢?
服务器是不能重新启动的。
yangxuebao123 2010-07-19
  • 打赏
  • 举报
回复
for(int i=0;i<10;i++){
my=new MyThread(Integer.toString(i));
my.start();
}


一般socket如果服务器端有异常,或者断开,就会造成异常出来,最好是当客户端发现异常的时候马上重新启动程序,因为有线程被堵塞了。。。
yangxuebao123 2010-07-19
  • 打赏
  • 举报
回复
你是用的什么方式的啊,多线程并发的吗。。。

81,095

社区成员

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

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