0

ANSWER IS MY OTHER COMMENT

I have a problem, I'm sending user and password String via DatagramPacket and DatagramSocket to a remote machine and I want to do a select statement in a database, but the thing is that the received string appears to be what it is supossed to be,here some code:

//build and send method
public void packetCompose(String user, String password) {
    try {
        byte[] userBytes = user.getBytes();
        byte[] passwordBytes = password.getBytes();
        byte[] buf = new byte[256];
        System.arraycopy( userBytes    , 0, buf,   0, Math.min( userBytes.length, 128 ) );
        System.arraycopy( passwordBytes, 0, buf, 128, Math.min( userBytes.length, 128 ) );

        DatagramPacket packet = new DatagramPacket(buf, 256, serverAddress, 4445);
        socket.send(packet);
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

and now the decompose of the packet method

public void packetDecompose(DatagramPacket packet) {
            // packet has this structure
            // 128 bytes            user String
            // 128 bytes            password String
            clientAddress = packet.getAddress();
            String user = new String(packet.getData(),0,128);
            String password = new String(packet.getData(),128,128);
            System.out.println("Packet content: \nuser: "+user+"\npassword: "+password);
            boolean exists = userExists(user, password);
            byte[] buf = new byte[128];
            if(exists) {
                    System.out.println("User exists");
                    System.arraycopy( accessGranted.getBytes(), 0, buf, 0, Math.min(
accessGranted.getBytes().length, 128 ) );
                    send(new DatagramPacket(buf, 128, clientAddress, 4445));
            } else {
                    System.out.println("User does not exist");
                    System.arraycopy( accessDenied.getBytes(), 0, buf, 0, Math.min(
accessDenied.getBytes().length, 128 ) );
                    send(new DatagramPacket(buf, 128, clientAddress, 4445));
            }

    }

    public boolean userExists(String user, String password) {
            boolean exists = false;
            System.out.println("user: "+user.equals("asdf"));
            System.out.println(" pass: "+password.equals("asdf"));
            try {

                    ResultSet result = dataBase.Select("SELECT ipaddress FROM users
WHERE name='"+user+"' AND pass='"+password+"'");
                    while(result.next()) {
                            exists = true;
                    }
            } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
            return exists;
    }

Im introducing asdf as user and password via interface of application so the lines:

System.out.println("user: "+user.equals("asdf"));
System.out.println(" pass: "+password.equals("asdf"));

should print true, but they print false. Any suggestion on this? Thank you all in advance

J. Arenas
  • 493
  • 1
  • 9
  • 23

2 Answers2

1

You appear to have Strings which will be 128 bytes long. These strings have normal text followed by null bytes which you might not be able to see on the screen.

I suggest you write the Strings using DataOutputStream.writeUTF() so it will send the length and only the byte actually in the String (without null padding).

Peter Lawrey
  • 525,659
  • 79
  • 751
  • 1,130
  • I understand what you say but I want to send it that way because in near future the packet will contain more things, such as bytes of a file, I think i will try to send a byte containing the string length. Doing it that way it should not read null bytes – J. Arenas Dec 02 '12 at 14:06
  • I have resolved it doing it my way, I will include in my question, but your answer give me some help so I upvote it . – J. Arenas Dec 02 '12 at 14:43
  • That's exactly what writeUTF() does except that it uses 16 bits rather than 8 for the length. And it already exists. And solves a couple of other problems at the same time. – user207421 Dec 02 '12 at 17:28
0

I finally managed to resolve it, thanks to Peter Lawrey for giving some help.

You have to insert the first byte containing the length of the user String and same with pasword, so when you decompose the packet you can get user and password without null padding. Here is the code:

Compossing:

public void packetCompose(String user, String password) {
    try {
        byte[] userBytes = user.getBytes();
        byte[] passwordBytes = password.getBytes();
        byte[] buf = new byte[256];
        //first byte contain user length in bytes
        System.arraycopy( new byte[]{(byte)userBytes.length}    , 0, buf, 0, 1 );
        // Then the user
        System.arraycopy( userBytes    , 0, buf,   1, userBytes.length );
        //a byte containing password length in bytes after user
        System.arraycopy( new byte[]{(byte)passwordBytes.length} ,0 , buf,   userBytes.length +1, 1);
        // password
        System.arraycopy( passwordBytes , 0, buf,   userBytes.length+2, passwordBytes.length );

        DatagramPacket packet = new DatagramPacket(buf, 256, serverAddress, 4445);
        socket.send(packet);
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}

Decompossing:

public void packetDecompose(DatagramPacket packet) {
            // packet has this structure
            // 1 byte                       user length in bytes
            // ? bytes                      user String
            // 1 byte                       password length in byte
            // ? bytes              password String
            clientAddress = packet.getAddress();
            byte[] userLength = new byte[]{packet.getData()[0]};
            String user = new String(packet.getData(), 1, (int)userLength[0]);
            byte[] passwordLength = new byte[]{packet.getData()[(int)userLength[0]+1]};
            String password = new String(packet.getData(), (int)userLength[0]+2, (int)passwordLength[0]);
            System.out.println("Packet content: \nuser: "+user+"\npassword: "+password);
            boolean exists = userExists(user, password);
            byte[] buf = new byte[128];
            if(exists) {
                    System.out.println("User exists");
                    System.arraycopy( accessGranted.getBytes(), 0, buf, 0, Math.min(
accessGranted.getBytes().length, 128 ) );
                    send(new DatagramPacket(buf, 128, clientAddress, 4445));
            } else {
                    System.out.println("User does not exist");
                    System.arraycopy( accessDenied.getBytes(), 0, buf, 0, Math.min(
accessDenied.getBytes().length, 128 ) );
                    send(new DatagramPacket(buf, 128, clientAddress, 4445));
            }

    }
J. Arenas
  • 493
  • 1
  • 9
  • 23