0

答えは私の他のコメントです

問題があります。ユーザーとパスワードの文字列を DatagramPacket と DatagramSocket 経由でリモート マシンに送信しています。データベースで select ステートメントを実行したいのですが、受信した文字列が想定どおりに表示されます。 、ここにいくつかのコード:

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

そして今、パケットメソッドの分解

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

アプリケーションのインターフェイスを介してユーザーとパスワードとして asdf を導入するので、次のようにします。

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

true を出力する必要がありますが、false を出力します。これに関する提案はありますか?よろしくお願いします

4

2 に答える 2

1

128 バイトの長さの文字列があるようです。これらの文字列には通常のテキストがあり、その後にヌル バイトが続くため、画面に表示されない場合があります。

DataOutputStream.writeUTF() を使用して文字列を作成することをお勧めします。これにより、文字列の長さと実際のバイトのみが送信されます (null パディングなし)。

于 2012-12-02T13:07:46.947 に答える
0

助けてくれた Peter Lawrey のおかげで、ようやく解決することができました。

ユーザー文字列の長さを含む最初のバイトを挿入する必要があり、パスワードと同じです。そのため、パケットを分解すると、null パディングなしでユーザーとパスワードを取得できます。コードは次のとおりです。

構成:

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

分解:

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

    }
于 2012-12-02T14:47:24.693 に答える