0

クライアントからサーバーに int 値を送信しようとしました。これは、以下で使用しているクライアント コードです。

_port   = 8071;
_socket = new Socket("localhost", _port);

Random rand = new Random();
int  n = rand.nextInt(50) + 1;
DataOutputStream dos = new DataOutputStream(_socket.getOutputStream());
dos.writeInt(n);
dos.flush();

サーバーコード

try {
    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    ObjectInputStream in = null;
    in = new ObjectInputStream(socket.getInputStream());
    int ClientNumber= in.readInt();
    System.out.println(ClientNumber);
}

しかし、無効なストリーム ヘッダー エラーが発生しています。

無効なストリーム ヘッダー: 0000002B で java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:781) で java.io.ObjectInputStream.(ObjectInputStream.java:278) で ServiceRequest.run(ServiceRequest.java:24) で java.util. concurrent.Executors$RunnableAdapter.call(Executors.java:439) の java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) の java.util.concurrent.FutureTask.run(FutureTask.java:138) java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) で java.lang.Thread.run(Thread.java) :680)

誰がエラーの原因を知っていますか? コードの設定が不適切ですか?

4

2 に答える 2

1

を使用して書き込み、 を使用しDataOutputStream読み取りますObjectInputStreamDataInputStream代わりに使用する必要があります:

// Note declaration and assignment in a single statement. There's no point in
// making it null first.
DataInputStream in = new DataInputStream(socket.getInputStream());

// Note use of camelCase for variable name
int clientNumber = in.readInt();

ここも取り除く必要がありinputます: あなたはそれから読んでいるのではなく、これはバイナリデータのストリームのように見えるため、テキストとして扱うのは不適切です。

ああ、finallyブロック内の入力ストリームを閉じる必要があります。

于 2013-04-30T16:17:59.270 に答える
0

このように変更してみてください

try {
             //   input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            DataInputStream in = new DataInputStream(socket.getInputStream());
            int clientNumber= in.readInt();
            System.out.println(clientNumber);
}

それはうまくいくはずです。ObjectInputStream は、ObjectOuputStream によって送信されたストリームのみを読み取ることができます。これは、マジック ナンバー (ヘッダー) で始まります。http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html0xACEDを参照してください。

于 2013-04-30T16:22:20.337 に答える