J. Arenas
J. Arenas

Reputation: 493

String sent by DatagramPacket and DatagramSocket is not equals to literal representation of itself

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

Upvotes: 0

Views: 3657

Answers (2)

J. Arenas
J. Arenas

Reputation: 493

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));
            }

    }

Upvotes: 0

Peter Lawrey
Peter Lawrey

Reputation: 533880

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).

Upvotes: 1

Related Questions