Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4235914

EOFException in readUnsignedByte when stream is of a certain size

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • None
    • 1.2.0
    • core-libs
    • x86
    • windows_98



      Name: tb29552 Date: 05/06/99


      /*
      Hi there,
      We have a problem with ByteArrayInputStream or DataInputStream.
      We don't know where the problem exactly happens, probably in
      ByteArrayInputStream. In just one case we get an exception if the
      stream is of a certain size, if we add/remove a blank or character to the
      stream, the problem doesn't exist (no exception). We have also tried
      JDK 1.1.8 but the problem persists.
      Here is the test case:

      program which simulates the following situation:

      In the sending part, a Vector is written into a stream and then into a
      String Then a int (count), the converted Vector and the CRC of the
      converted Vector are again written into a stream, which is then
      converted into a String.

      In the receiving part, the String is attempted to read into a stream,
      and normally put in a String Array.

      What happens is this:
      % javac testsendstream.java
      % java -Djava.compiler=NONE testsendstream
      to second stream: 000104FGEEEDftFFFekt00070001
                                                    chosen type0002
                                                                   chosen brand0003
                                                                                   config name0004group00060012
      to send: 2000???0001??04??FGEEEDftFFFekt??0007??0001??
                                                            chosen type??0002??
                                                                               chosen brand??0003??
                   config name??0004??group??0006??00120000000000908106492
      ??0001??04??FGEEEDftFFFekt??0007??0001??
                                              chosen type??000
      IOException: receiveString
         incrcstring contains: null
      java.io.EOFException
              at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:247)
              at java.io.DataInputStream.readUTF(DataInputStream.java:526)
              at java.io.DataInputStream.readUTF(DataInputStream.java:498)
              at testsendstream.main(testsendstream.java:156)
      CRC not correct



      */

      import java.util.*;
      import java.util.zip.*;
      import java.io.*;
      import java.lang.reflect.*;

      class testsendstream {

          public static void main(String args[]) {

              /** sending part*/

              ByteArrayOutputStream byteoutstream = new ByteArrayOutputStream();
              DataOutputStream dataoutstream = new DataOutputStream(byteoutstream);
              byteoutstream.reset();

              boolean fpfound = false;
              int count = 0;

              Vector vect = new Vector();

              vect.addElement(new Integer(4));
              vect.addElement(new String("FGEEEDftFFFekt"));
              vect.addElement(new Integer(7));
              vect.addElement(new Integer(1));
              vect.addElement(new String("chosen type")); // <- add/remove a blank
                                                              // or character and it
                                                              // works
              vect.addElement(new Integer(2));
              vect.addElement(new String("chosen brand"));
              vect.addElement(new Integer(3));
              vect.addElement(new String("config name"));
              vect.addElement(new Integer(4));
              vect.addElement(new String("group"));
              vect.addElement(new Integer(6));
              vect.addElement(new Integer(12));

              int cmd = 0x2000;
              int cmdtest = ((Integer) vect.elementAt(0)).intValue();

              int[] posdigact = {1, 2, 3, 4, 6};

              count++;
              try {
                  dataoutstream.writeUTF(convertInt(4, count)); // count
                  dataoutstream.writeUTF(convertInt(2, cmdtest)); // Number
                  dataoutstream.writeUTF((String) vect.elementAt(1)); // ID
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(2)).intValue())); // Number
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(3)).intValue())); // Field pos
                  dataoutstream.writeUTF((String) vect.elementAt(4)); // Value
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(5)).intValue())); // Field pos
                  dataoutstream.writeUTF((String) vect.elementAt(6)); // Value
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(7)).intValue())); // Field pos
                  dataoutstream.writeUTF((String) vect.elementAt(8)); // Value
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(9)).intValue())); // Field pos
                  dataoutstream.writeUTF((String) vect.elementAt(10)); // Value
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(11)).intValue())); // Field pos
                  dataoutstream.writeUTF(convertInt(4, ((Integer) vect.elementAt(12)).intValue())); // Value
              }
              catch(IOException e) {
                  System.out.println("IOException");
                  e.printStackTrace();
              }

              String framestring = byteoutstream.toString();

              System.out.println("to second stream: " + framestring);

              String command = Integer.toHexString(cmd);

              ByteArrayOutputStream byteoutstream2 = new ByteArrayOutputStream();
              DataOutputStream dataoutstream2 = new DataOutputStream(byteoutstream2);
              byteoutstream2.reset();
              byte[] crcbyte = framestring.getBytes();
              CRC32 crc = new CRC32();
              crc.reset();
              crc.update(crcbyte);
              try {
                  dataoutstream2.writeUTF(command);
                  dataoutstream2.writeUTF(framestring);
                  String crcstringvalue = convertLong(crc.getValue());
                  dataoutstream2.writeUTF(crcstringvalue);
                  dataoutstream2.flush();
                  dataoutstream2.close();
              }
              catch(IOException e) {
                  System.out.println("IOException sendString");
                  e.printStackTrace();
              }
              String sendstring = byteoutstream2.toString();

              System.out.println("to send: " + sendstring);

              String received = sendstring;

              /**receiving part */


              String[] s = new String[2];
              String incrcstring=null;
              long incrc = 0;

              byte[] inbyte = received.getBytes();
              ByteArrayInputStream byteinstream = new ByteArrayInputStream(inbyte);
              DataInputStream datainstream = new DataInputStream(byteinstream);
              byteinstream.reset();

              try {
                  s[0] = datainstream.readUTF(); // command
                  s[1] = datainstream.readUTF(); // instring
                  System.out.println(s[1]);
                  incrcstring = datainstream.readUTF();
                  incrc = Long.parseLong(incrcstring);
              }
              catch(IOException e) {
                  System.out.println("IOException: receiveString");
                  System.out.println(" incrcstring contains: " + incrcstring);
                  
                  e.printStackTrace();
              }


              byte[] crcbyte2 = s[1].getBytes();
              CRC32 crc2 = new CRC32();
              crc2.reset();
              crc2.update(crcbyte2);

              if (crc2.getValue() == incrc)
                  System.out.println("Frame correctly received");
              else
                  System.out.println("CRC not correct");

          }

          synchronized static String convertInt(int max, int toconvert) {

              String converted = new String();
              String temp;

              temp = String.valueOf(toconvert);
              int le = temp.length();

              for (int i = 0; i < (max - le); i++)
                  converted += "0";
              converted += temp;

              return converted;
          }


          synchronized static String convertLong(long longnumber) {
              String converted = new String();
              String temp;

              temp = String.valueOf(longnumber);
              int le = temp.length();

              for (int i = 0; i < (19 - le); i++)
                  converted += "0";
              converted += temp;

              return converted;
          }
      }

      /*

      The blank/character can be added/removed in any of the above strings
      and the problem doesn't occur. We are about to program a
      communication protocol for Internet communication any need a solution
      to this problem urgently.
      Any ideas?
      For any questions, don't hesitate to contact us at
      ###@###.### (Peter) or
      ###@###.### (Georg)

      Best regards
      Peter

      */
      (Review ID: 57890)
      ======================================================================

            mr Mark Reinhold
            tbell Tim Bell
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: