0

我正在尝试读取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)

有人可以帮我理解为什么这不起作用。

4

4 回答 4

5

对于初学者,如果您在一端写入一系列(加密!)字节,并尝试在另一端读取 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);
于 2012-04-27T02:54:25.850 回答
0

DataIputStream.readUTF()适用于您使用 DataOutputStream.writeUTF()` 写入的数据。您还没有编写 UTF,因此您无法阅读它。

这是二进制数据,因此您根本不应该考虑 UTF 或字符串。用 写入数组的长度writeInt(),然后用 写入数组write()。在另一端,用 读取长度readInt(),分配一个那么大的 byte[] 缓冲区,然后用 将密文读入其中readFully()

于 2012-04-27T03:45:03.923 回答
0

你必须使用 read 方法获取消息并获取真实消息的字符数,然后将其转换为字符串

int bytesRead = 0;
byte[] messageByte = new byte[1000];

bytesRead = dis.read(messageByte);
String chiper = new String(messageByte, 0, bytesRead);
System.out.println(chiper);
于 2014-04-04T01:28:36.833 回答
-1

在客户端,您应该将 byte[] 数组转换为字符串并用于 dout.writeUTF()发送转换后的字符串。

于 2012-04-27T03:08:44.973 回答