Ошибка при использовании InputStreamReader с Java

Я попытался отправить значение типа 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 : 680)

Кто-нибудь знает, что вызывает ошибку? Мой код настроен неправильно?


person user2328999    schedule 30.04.2013    source источник
comment
Почему вы создаете InputStreamReader, wrapping it in a BufferedReader`, а затем полностью игнорируете его?   -  person Jon Skeet    schedule 30.04.2013


Ответы (2)


Вы пишете с помощью DataOutputStream и читаете с помощью ObjectInputStream. Вместо этого вы должны использовать DataInputStream:

// 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.

person Jon Skeet    schedule 30.04.2013

попробуйте изменить это вот так

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

он должен работать. ObjectInputStream может читать только потоки, отправленные ObjectOuputStream, он начинается с магического числа (заголовка) 0xACED, см. http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html

person Evgeniy Dorofeev    schedule 30.04.2013