Запись / чтение объекта (сокет в Java) - PullRequest
0 голосов
/ 18 октября 2011

Мой вопрос заключается в том, что у меня есть класс объекта (пакет), в котором содержится другой объект (msg).Я делаю оба класса реализует Serializable .Но когда я запускаю свою программу, я вижу эту ошибку "java.io.StreamCorruptedException: неверный код типа: 00", некоторая часть моего кода:

outStrm=new ObjectOutputStream(mySocket.getOutputStream());
inStrm=new ObjectInputStream(mySocket.getInputStream());
outStrm.writeObject(new packet());
outStrm.flush();

и на стороне сервера я читаю вот так

Socket client = listen_socket.accept();
in=new ObjectInputStream(client.getInputStream());
out=new ObjectOutputStream(client.getOutputStream());
p=(packet) in.readObject();

Я отправляю много пакетов, и странная часть в том, что когда я отлаживаю его (шаг за шагом), я не вижу ошибки, но когда я ее запускаю, у меня есть эта ошибка!Пожалуйста, помогите мне.

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

class ServerThre
    extends Thread
{
    Socket client;
    ObjectInputStream in;
    ObjectOutputStream out;

    public ServerThre(Socket client_socket)
    {
        client = client_socket;
        try
        {
            in = new ObjectInputStream(client.getInputStream());
            out = new ObjectOutputStream(client.getOutputStream());
        }
        catch (IOException e)
        {
            try
            {
                client.close();
            }
            catch (IOException e2)
            {
            }
            System.err.println("Exception while getting input streams: " + e);
            return;
        }
        this.start();
    }

    private packet getPacket() throws IOException
    {
        packet p;
        try
        {
            p = (packet)in.readObject();
            if (p != null)
            {
                return p;
            }
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void run()
    {
        while (!client.isClosed())
        {

            packet p = null;
            try
            {
                p = getPacket();
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }

            if (p == null)
            {
                System.out.print("Connection closed by server, exiting");
                return;
            }

        }// end of while
    }

}

1 Ответ

0 голосов
/ 18 октября 2011

В этом коде есть несколько странностей.

  1. Проверка на p != null в getPacket() абсолютно бессмысленна.

  2. Более поздний тест, который приравнивает p == null к закрытому соединению, неверен. В этом случае вы получите исключение EOFException, а не NULL.

  3. Socket.isClosed () только сообщает вам, вы закрыли сокет.

«Недопустимый код типа» обычно возникает, когда вы используете один ObjectInputStream для чтения и несколько ObjectOutputStreams для записи или наоборот. Используйте один из них на весь срок службы розетки на обоих концах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...