我正在尝试读取从客户端发送到服务器的byte[]
。
这是我的客户端代码...
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
Cipher cipher = Cipher.getInstance("RSA");
// encrypt the aeskey using the public key
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] cipherText = cipher.doFinal(aesKey.getEncoded());
dout.write(cipherText);
这是我的服务器代码...
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
String chiper = dis.readUTF();
System.out.println(chiper);
但是,dis.readUTF();
行失败并出现异常...
java.io.EOFException at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readUTF(DataInputStream.java:609)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at gameserver.ClientHandler.run(GameServer.java:65)
有人可以帮我理解为什么这不起作用。
对于初学者来说,如果你在一端编写一个(加密的!)字节序列,并试图在另一端读取一个 UTF 格式的字符串......你会过得很糟糕。
我建议在客户端你应该做一些类似的事情
dout.writeInt(cipherText.length);
dout.write(cipherText);
然后在服务器端,你应该做一些类似的事情
int byteLength = dis.readInt(); // now I know how many bytes to read
byte[] theBytes = new byte[byteLength];
dis.readFully(theBytes);
DataIputStream.readUTF()
用于使用DataOutputStream.writeUTF()'写入的数据。你没有写过UTF,所以你无法阅读它。
这是二进制数据,因此您根本不应该考虑 UTF 或字符串。用 writeInt()
写数组的长度,然后用 write()
写数组。在另一端,用readInt()
读取长度,分配一个那么大的 byte[] 缓冲区,然后用 readFully()
将密文读入其中。
Yo 必须使用 read 方法获取消息并获取真实消息的字符数,然后将其转换为字符串
int bytesRead = 0;
byte[] messageByte = new byte[1000];
bytesRead = dis.read(messageByte);
String chiper = new String(messageByte, 0, bytesRead);
System.out.println(chiper);
在客户端,您应该将 byte[] 数组转换为 String 并使用 dout.writeUTF()
发送转换后的字符串。