谢谢zyg158((DD)One-Time Password System) 。-----------connect() 建立socket连接
public boolean connect() {//throws Exception {
      try
      { //构造工作Socket
        mySocket = new Socket( myip , myport );        mySocket.setSoTimeout(ComConstants.CmppRCVSOCK_TIMEOUT);  //
        //mySocket.setReceiveBufferSize(8192);
        //mySocket.setSendBufferSize(8192);
        myinputstream = mySocket.getInputStream() ;  //输入管理对象
        myoutputstream = mySocket.getOutputStream() ;  //输出管理对象        dataInStream = new DataInputStream(myinputstream);  //?????
        //dataOutStream = new DataOutputStream(outStream);        System.out.println("与服务器连接成功!!!at 连接器/connect ->ip: "+myip+"->port:"+myport);
        return true;
      }catch (Exception e)
      {
        //断开连接
        disconnect();
        mystate= ComConstants.NOTCONNECTED;  //标记为非连接状态
        PublicConstants.writeLog.info("Cmpp Connected ISMG fail(bindtype:"+myBindType+"):"+e.toString(),0);
        System.out.println("!!!与服务器连接失败! at 连接器/connect 原因:"+e.getMessage());
        return false;
      }
    }--------------recvByteStream()从对方读取数据。
 private byte[] recvByteStream()//接受的数据不包含总共长度
    {
        byte[] receivedData=new byte[1000];  //接收数组
        byte[]  retRecvData;  //实际返回数组
        int dataTotalSizeToRead ;
        int dataToReadLeft ;
        int dataThisTimeRead;  //本次读数长度        try {
            int dataSize = dataInStream.readInt(); //消息长度
            dataTotalSizeToRead = dataSize - 4;  //总长度
            dataToReadLeft = dataSize - 4;  //剩余长度            while(dataToReadLeft > 0)
            {
                dataThisTimeRead = dataInStream.read(receivedData,dataTotalSizeToRead - dataToReadLeft,dataToReadLeft);
                dataToReadLeft -= dataThisTimeRead;
            }            System.out.println("===连接器/recv. 正常接收===");
            if( (dataSize<12)||(dataSize>800) )
            {
                retRecvData = new byte[1];
                retRecvData[0] = (byte)ComConstants.ERROR_SOCKET ; //消息长度
                System.out.println("->>但是,长度不规范(<12||>800):"+dataSize);
                return retRecvData;
            }            //从接收数组中截取
            retRecvData = new byte[dataSize - 4];
            for(int i=0;i<dataSize - 4;i++)
                retRecvData[i]=receivedData[i];        } catch(NullPointerException e)
        {
            //PublicConstants.writeLog.error("Cmpp recv connection null: "+e.toString() ) ;
            retRecvData = new byte[1];
            retRecvData[0] = (byte)ComConstants.ERROR_SOCKET ;
            System.out.println("!!!Err at 连接器/recv. NullPointerException:"+e.getMessage());
        }
        catch(InterruptedIOException e)
        {
            retRecvData = new byte[1];
            retRecvData[0] = (byte)ComConstants.ERROR_INTERRUPT ;
            System.out.println("!!!Err at 连接器/recv. InterruptedIOException:"+e.getMessage());
        }
        catch(EOFException e) {
        //////////////////////////////////////////
        ////!!!!!就是抛出这个异常!!!!!!
        //上面的System.out.println("===连接器/recv. 正常接收===");没有被执行到就抛出异常了
        /////////////////////////////////////////
            retRecvData = new byte[1];
            retRecvData[0] = (byte)ComConstants.ERROR_SOCKET ;
            System.out.println("!!!Err at 连接器/recv. 不到4个字节:"+e.getMessage());
        }
        catch(Exception e) {
            //PublicConstants.writeLog.error("Cmpp recv socket: "+e.toString() ) ;
            retRecvData = new byte[1];
            retRecvData[0] = (byte)ComConstants.ERROR_SOCKET ;
            System.out.println("!!!Err at 连接器/recv. socket接收异常:"+e.getMessage());
        }
        return retRecvData;
    }再请求指点。

解决方案 »

  1.   

    经测试,异常在执行
       int dataSize = dataInStream.readInt(); //消息长度
    后就抛出了。请问,是不是有可能调用readInt有问题?
    因为从java的readInt帮助看,有这么一句:This method is suitable for reading bytes written by the writeInt method of interface DataOutput.
      

  2.   

    你在发送的时候
    流中是首先写的writeInt()吗?
    发送的函数看看
    首先要彼此对应
      

  3.   

    再次谢谢zyg158((DD)One-Time Password System
      

  4.   

    int dataSize = dataInStream.readInt(); //消息长度
    你试着将dataInStream转换为String然后得到长度
    eof 异常就是找不到结束符号吧
    或者dataInStream有可能为null
      

  5.   

    public class EOFException
    extends IOException
    Signals that an end of file or end of stream has been reached unexpectedly during input. This exception is mainly used by data input streams to signal end of stream. Note that many other input operations return a special value on end of stream rather than throwing an exception.顶!等待学习
    高手快进!!!
      

  6.   

    问题已经解决。
        用read()将不会抛出异常。因为read是block方式的。
        readInt()抛出异常的原因(我遇到的)是对方在该端口没有消息发送。谢谢两位。