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

読み取りメソッドを使用してメッセージを取得し、実際のメッセージの文字数を取得してから、これを文字列に変換する必要があります

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 []配列をString dout.writeUTF()に変換し、変換されたStringを送信するために使用する必要があります。

于 2012-04-27T03:08:44.973 に答える