块来帮我啊,大哥大姐们。。
就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){....}
就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){....}
my=new MyThread(Integer.toString(i));
my.start();
}
一般socket如果服务器端有异常,或者断开,就会造成异常出来,最好是当客户端发现异常的时候马上重新启动程序,因为有线程被堵塞了
楼上说的有道理,但是线程阻塞该怎么检查出来并处理掉呢?
服务器是不能重新启动的。
前几天,看到别人用java程序可以结束掉.bat文件,也可以开启.bat文件、、、
调用的时候 给窗口命名为name
cmd /c statr "name" java xxxx程序执行中关闭的话
关掉刚才定义的name的窗口,进程也就被关闭了
cmd /c taskkill /FI "WINDOWTITLE eq name" /IM * /Fcommand = cmd /c taskkill /FI "WINDOWTITLE eq name" /IM * /F
用Runtime.getRuntime().exec(command);
你说的那个处理线程的方法,我也没办法,可能有些人是用的集群,就是多个服务器,一个断了,还有另外一个
try {
// 要运行的程序的路径
String message= "D:/create.bat ";
// 运行这个程序的程序
String cmd[]={ "cmd.exe ",message};
// 开始执行
Runtime.getRuntime().exec(cmd);
}
catch (IOException ex) {
ex.printStackTrace();
}