手里一个项目,当调用OutputStream.write(byte[])时,偶尔会出现java.net.SocketException ConnectionReset的异常我想问这个异常出现的可能原因是什么?从现象看貌似是Socket受阻塞,一定时间后重开相同的Socket导致这个异常,不知道是不是。。我也只是瞎猜的代码太长不便放出,很急啊= =希望大家关注啊,有可能还会有后续问题= = 分不是问题。

解决方案 »

  1.   

    查一下你的代码, 看是不是在OutputStream.write(byte[])时.死循环了。还是文件太大。长时间进行连接.就会出现这个错。
      

  2.   


    比如 我一次要对某个socket write10次
    我的写法是:在for循环中
    socket.getOutputStream().write(bytes);
    socket.getOutputStream().flush();但是加上输出语句发现,不到10次,write处就会报异常
      

  3.   


    嘛 只是一个小项目 GFW不会关注滴
      

  4.   

    不知道有没有可能是我接收端的问题我是这样写的:一个线程,不断循环。 ss表示ServerSocket public void run() {
    while (true) {
    byte[] buffer = new byte[BUFFER];
    try {
    Socket s = ss.accept();
    s.getInputStream().read(buffer);
    receive(buffer); System.out.println("After Receive " + buffer.length); s.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }接收到一个socket连接 收完 关掉 不知道会不会产生问题?
      

  5.   

    bytes  太大? 放小试试
                
      

  6.   


    你可以加上判断如果没有接收到请求 可以sleep上几秒后 再继续循环
    也许就是这种不断去循环造成的
      

  7.   

     while (true) 修改了
    int temp=0
    while((temp = inputStream.read(buffer)) != -1){
      System.out.println("After Receive " + buffer.length);
      

  8.   

    明显是接收端的问题,你read(buffer)一次可以读完,发送端的for 10次吗?。
    如果是交互很频繁的话,就使用长连接,而不用每次读完就关掉,这个很损性能。
      

  9.   


    每次read都是读的一次啊  性能什么的暂时不考虑 = =
    有个问题,比如接收端除了接受线程,还有若干其他的工作线程,当接受线程被挂起,切换到别的线程,这个时候socket write了进来,那么这部分能接收到吗?
      

  10.   


    一。 问题应该是在这。最好减少socket write 次数。一次试试看。
    二。socket.getOutputStream().write(bytes); 最好修改为
        int temp=0
    while((temp = inputStream.read(buffer)) != -1){
      System.out.println("After Receive " + buffer.length);

      

  11.   

    TCPClient
     
    try {  
       for(int i=0;i<100;i++){   
                Socket socket = new Socket("10.219.101.118",9968);  
                InputStream inputStream = new FileInputStream("D://tt.TXT");  
                OutputStream outputStream = socket.getOutputStream();  
                byte buffer [] = new byte[4*1024];  
                int temp = 0 ;  
                while((temp = inputStream.read(buffer)) != -1){  
                    outputStream.write(buffer, 0, temp);  
                }  
                outputStream.flush();  
                }
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  server serverSocket = new ServerSocket(9968);  
                byte buffer [] = new byte[1024*4];  
                int temp = 0;  
     
                while(true){  
                    Socket socket = serverSocket.accept();  
        
                    InputStream inputStream = socket.getInputStream();  
                    temp = inputStream.read(buffer);  
                    System.out.println(new String(buffer,0,temp));  
                }  测试没问题。不知道LZ TCPClient是怎么的逻辑。
      

  12.   

    按理说TCP应该不会存在丢失的问题吧?我现在发现偶尔会出现某一些byte[] 没有送达到接收端
      

  13.   

    木有人拉 顶上去 = =我又想到一点:像接收端这样的死循环中,ServerSocket不断的接收socket如果在死循环中写了一段非常耗时的代码,那么socket还能正常接收吗?比如,发送端建立socket请求接收端连接,接收端正忙,不能立刻accept socket本身没有设置超时参数
    那么,当接收端忙完后,执行到accept()代码,是否能够接收到这个socket?
      

  14.   

    1、如果在死循环中写了一段非常耗时的代码,那么socket还能正常接收吗?
    这个不能正常接收,只能接收忙完之后,才执行到accept()。 因为read、accept都是阻塞的。
    2、当接收端忙完后,执行到accept()代码,是否能够接收到这个socket?
    这个就要看你设置的连接超时的时间了,比如
    socket.connect(new InetSocketAddress("127.0.0.1", 9999),timeout); 你设置的timeout是多久就会等待多久。
      

  15.   


    终于有人回复了~~也就是说如果超时了,这个socket连接就接收不到了是吧?1 假如我无法确定耗时代码的时间,如何设置Timeout? KeeyAlive?2 对于我说的这种情况,一般的应对方案是什么?
      

  16.   

    如果你无法确定时间,就不用设置连接超时,嘿嘿,好像不设置就默认不超时。
    socket.connect(new InetSocketAddress("127.0.0.1", 9999));一般是accept和read、write是分开的,就是说一个连接上来了,就开一个线程去处理输入输出,
    这样的话,不管多少个socket连接上去都可以处理,不过这你还要处理一下socket的连接上限,不然几百几千个同时连上来就挂掉了。
      

  17.   

    这个异常代表服务端主动关闭,你的接收端进行了一次read()然后close,发送端的10次write()需要几次read()能读完是不确定的,如果在for循环没有执行完时接收端已经满足了读的条件并且读了,然后close(),此时发送端继续write就会出现Connection Reset了对于你这种使用短连接进行多包通讯的场景,要能达到真正可用的程度,至少需要依靠数据本身来标识一次逻辑通讯的完整性,例如在整个报文前面加上本次通讯的长度,或者在报文最后加上预定义的特殊结束符,接收端循环读,直到满足报文的完整条件,另外最好是客户端先关闭连接
      

  18.   


    是的 这个异常的确是因为服务端先关闭了Socket导致write不过来了我现在的问题是 发送端可以全部write出去,但是接收端不能全部收下,有可能中途漏掉几次 = =另外听上面有人说长连接,但是如何应对发送间隙的空闲期? 如果循环中的read会一直返回-1, 我又如何判断这一次长连接什么时候终止呢
      

  19.   

    你把socket 或者 流关了