块来帮我啊,大哥大姐们。。
就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){....}

解决方案 »

  1.   

       for(int i=0;i<10;i++){
                 my=new MyThread(Integer.toString(i));
                 my.start();
     }
    一般socket如果服务器端有异常,或者断开,就会造成异常出来,最好是当客户端发现异常的时候马上重新启动程序,因为有线程被堵塞了
      

  2.   

    我用的线程池。ThreadPoolExecutor
    楼上说的有道理,但是线程阻塞该怎么检查出来并处理掉呢?
    服务器是不能重新启动的。
      

  3.   

    我用的是多线程并发的,问题不是很大,只要过一个星期自己手动重启一下就行了,大概也并发了几万个进程了。。我是一段时间扫描一下,是个死循环。  打包成jar文件了,然后通过.bat文件运行
    前几天,看到别人用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);
    你说的那个处理线程的方法,我也没办法,可能有些人是用的集群,就是多个服务器,一个断了,还有另外一个
      

  4.   


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