[PublicFunction]接收数据 Exception:java.net.SocketException: Connection reset
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.io.DataInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.read0(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at com.guiyangyaxun.isagsms.util.PublicFunction.recvByte(PublicFunction.
java:76)
        at com.guiyangyaxun.isagsms.sms.ISAG_SMS_MOServerProessThread$ISAG_SMS_M
OReceiveThread.run(ISAG_SMS_MOServerProessThread.java:41)
        at java.lang.Thread.run(Unknown Source)
[ISAG-SMS]MO连接(收)线程异常停止,异常原因:Connection reset
代码如下:public static StringBuffer recvByte(java.io.DataInputStream dataInStream)
throws Exception// 接受的数据
{
System.out.println("接收数据");
//BufferedReader d = new BufferedReader(new InputStreamReader(dataInStream, "UTF-8"));// 处理编码问题
Reader d = new InputStreamReader(dataInStream,"UTF-8");
StringBuffer receivedData = new StringBuffer();
try {
synchronized (dataInStream) {
int c;
while ((c = d.read()) != -1) {
receivedData.append((char) c);
System.out.println(c);
}

System.out.println(receivedData.toString());
}
} catch (Exception e) {
System.out
.println("[PublicFunction]接收数据 Exception:" + e.toString());
throw e;
}
return receivedData;
}怎么回事啊,模拟器测试可以的啦,怎么接到网关就不行了呢。异常出在while ((c = d.read()) != -1)这里,但没想明白是为什么?

解决方案 »

  1.   

    java.io.DataInputStream dataInStream 这个是从网络上读取的,可能是服务器端IO传输 reset了 。。
      

  2.   

    while ((c = d.read()) != -1) {
             receivedData.append((char) c);
             System.out.println(receivedData.toString());
      }
                    
                    
    我跟踪看了,对方传的SOAP包都收完全了的,怎么会while ((c = d.read()) != -1)这个地方出异常了呢。
      

  3.   

    有可能其它地方在操作dataInStream
      

  4.   

    dataInStream是参数传进来的,方法外是否有对dataInStream所使用的socket源操作的地方?
      

  5.   

    这样read容易出问题他那边 关了io了,你这边读的太慢
      

  6.   

    to kreadk我就是按你的想法做的呀package com.guiyangyaxun.isagsms.sms;
    import java.io.DataInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;import com.guiyangyaxun.isagsms.util.Debug;
    import com.guiyangyaxun.isagsms.util.PublicFunction;public class ISAG_SMS_MOServerProessThread implements Runnable {
    /** 该线程运行标志 true 在运行,false停止 **/
    public static boolean isAvail = false;
    public ISAG_SMS_MOServerProessThread(){
    isAvail = true;
    }

    @Override
    public void run() {
    try {
    Debug.outInfo("[ISAG_SMS_Master]"+PublicFunction.getFormatTime()+" MO接收线程启动...");
    ServerSocket s=new ServerSocket(ISAG_SMS_Parameter.ListenPort);
    while(isAvail){
    System.out.println("有上行");
    Socket incoming=s.accept();
    new Thread(new ISAG_SMS_MOReceiveThread(incoming)).start();
    }
    } catch (Exception e) {
    // TODO: handle exception
    }
    }

    class ISAG_SMS_MOReceiveThread implements Runnable{
    private Socket incoming;
    public ISAG_SMS_MOReceiveThread(Socket i){
    incoming=i;
    }
    @Override
    public void run() {
    try {
    DataInputStream inputStream= new DataInputStream(incoming.getInputStream());
    StringBuffer recString    = PublicFunction.recvByte(inputStream);
                    inputStream.close();
                    incoming.close();

    //ISAG deliverMsg = new ISAG();
    //deliverMsg.parseDeliverPack(recString);

        //将Deliver消息保存在接收缓冲中,由ISAGMOSocketProcess的ISAGMODataSaveThread
            //线程将MO数据保存在数据库中
            //ISAG_SMS_DBAccess.getInstance().vctMOData.addElement(deliverMsg);


    } catch (Exception ex) {
    destory(ex);
    }
    }
    }

     /** 销毁线程 **/
      public void destory(Exception ex){
      ISAG_SMS_MOServerProessThread.isAvail=false;
        if(ex !=null){
          ex.printStackTrace();
          Debug.outInfo("[ISAG-SMS]MO连接(收)线程异常停止,异常原因:" + ex.getMessage());
        }
        else{
          Debug.outInfo("[ISAG-SMS]MO连接(收)线程异常停止");
        }
      } }
      

  7.   

    有解决办法吗,各位,是不是可以不用去管这个异常,数据倒是接收完了的,只是while ((c = d.read()) != -1)为什么数据都读完了,说明也到流未了,怎么不返回-1而是报异常呢?
      

  8.   

    楼上的,我收到对方的数据的,只是在收完数据的时候为什么while ((c = d.read()) != -1)不返回-1而抛Exception:java.net.SocketException: Connection reset,