java - DatagramPacket 和 DatagramSocket 发送的字符串不等于其本身的文字表示

标签 java sockets datagram

答案是我的其他评论

我有一个问题,我正在通过 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。 对此有什么建议吗?先谢谢大家了

最佳答案

您似乎有 128 字节长的字符串。这些字符串具有普通文本,后跟空字节,您可能无法在屏幕上看到这些字节。

我建议您使用 DataOutputStream.writeUTF() 编写字符串,这样它将发送长度并且仅发送字符串中实际的字节(没有空填充)。

关于java - DatagramPacket 和 DatagramSocket 发送的字符串不等于其本身的文字表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669541/

相关文章:

java - 如何知道我们是否收到了带有 DatagramPacket 的内容?

sockets - 如何拆分接收到的 boost asio udp 套接字联合数据报

java - Intent为什么要实现Cloneable?

java - 多人游戏(Java 套接字写入/读取对象)

java - 如何在 Java 中设置系统时间?

c++ - 如何在 C++ 中创建 RAW TCP/IP 数据包?

java - 使用缓冲读取器和套接字

c# - 如何增加 UDPClient 吞吐量

java - Hamcrest 匹配器无法匹配 boolean 类型属性

java - Java 8 Stream 的正确配置是什么