Не удается заставить ObjectInputStream работать - PullRequest
0 голосов
/ 22 марта 2012

Я сейчас пытаюсь заставить свой сервер создать соединение с клиентом.Я создал поток для каждого соединения, но сервер в настоящее время не создает входной поток.Я проверил это, напечатав номера, но только 1 и 2 распечатаны.Я уверен, что это всего лишь небольшая проблема, которую я пропустил.

public class ObjectHandler implements Runnable{
    Socket sock;
    ObjectInputStream ois;
    ObjectOutputStream oops;
    InputStream is;


    public ObjectHandler(Socket clientSocket) throws IOException {
        System.out.println("1");
        sock = clientSocket;

        is = sock.getInputStream();
        System.out.println("2");
        ois = new ObjectInputStream(new BufferedInputStream(is));
        System.out.println("3");

        OutputStream os = sock.getOutputStream();

        oops = new ObjectOutputStream(new BufferedOutputStream(os));
        outputSockets.add(oops);    

    }

Я теперь удалил IOException сгенерировало и окружил читателя ловушкой попытки.После сбоя клиент теперь печатает эту ошибку:

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at ThreadPool$ObjectHandler.<init>(ThreadPool.java:95)
at ThreadPool.addThread(ThreadPool.java:31)
at ObjectServerTest.go(ObjectServerTest.java:93)
at ObjectServerTest.main(ObjectServerTest.java:124)

Ответы [ 3 ]

6 голосов
/ 22 марта 2012

При построении потоков объектов через сокеты вам всегда необходимо создать выходной поток first и flush до создания входного потока (из-запотоки реализованы).

0 голосов
/ 22 марта 2012

Это работает для меня ...

ObjectHandler:

public ObjectHandler(Socket clientSocket) throws IOException {
    System.out.println("1");
    sock = clientSocket;
}


@Override
public void run() {
    try {
        is = sock.getInputStream();
        System.out.println("2");
        ois = new ObjectInputStream(new BufferedInputStream(is));
        System.out.println("3"+ois.readFloat());

        OutputStream os = sock.getOutputStream();

        oops = new ObjectOutputStream(new BufferedOutputStream(os)); 
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Клиент:

public static void main(String[] args) throws UnknownHostException, IOException {
    Socket client = new Socket(InetAddress.getByName("localhost"), 8888);
    OutputStream os = client.getOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(os);
    oos.writeFloat(new Float(10.10));
    oos.flush();
}
0 голосов
/ 22 марта 2012

Удалить BufferedInputStream.Тебе это не нужно.Ожидание до тех пор, пока не будут прочитаны 4K байтов.

Редактировать: удалить BufferedOutputStream тоже.И убедитесь, что вы очищаете поток вывода на стороне клиента.

...