从服务器读取字节[]



我正在尝试读取从客户端发送到服务器的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()发送转换后的字符串。

相关内容

  • 没有找到相关文章

最新更新