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