Клиент-сервер с использованием сокета: исключение в потоке main java.io.EOFException

Я пишу простую клиент-серверную программу, в которой сервер прослушивает все входящие соединения и принимает их. После принятия клиент отправляет данные (целое число) на сервер, а сервер возвращает целое число клиенту. Эта часть работает нормально. Кроме того, клиент отправляет данные последовательно (используя цикл while) при установленном соединении, и именно здесь я столкнулся с исключением «java.io.EOFException».

Сервер

прослушивание на порту: 3344

Получено: 1 от клиента

прослушивание на порту: 3344

клиент

Введите данные для отправки: 1

Сервер ответил: 1

Введите данные для отправки: 2

Исключение в потоке «основной» java.io.EOFException в java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2626) в java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) в java.io.ObjectInputStream. readObject(ObjectInputStream.java:373) в Node.main(Node.java:28)

Код клиента

    int serverPort = 3344;
    Scanner sc = new Scanner(System.in);

    Socket clientSocket = new Socket("localhost", serverPort);

    ObjectOutputStream write = new ObjectOutputStream(clientSocket.getOutputStream());
    ObjectInputStream read = new ObjectInputStream(clientSocket.getInputStream());
    Integer writeData = new Integer(0);

    while (true) {
        System.out.println("Enter Data to send: ");
        writeData = sc.nextInt();

        write.writeObject(writeData);
        write.flush();
        Integer obj = (Integer) read.readObject();
        if (obj.intValue() == -1) {
            break;
        }
        System.out.println("Server replied : " + obj.toString());
        System.out.println();
    }

    write.close();
    read.close();

    clientSocket.close();

Код сервера

        while (true) {
        System.out.println("listening on port : " + listenPort);
        try {
            clientSocket = listener.accept();

            write = new ObjectOutputStream(clientSocket.getOutputStream());
            read = new ObjectInputStream(clientSocket.getInputStream());

            int readInt = (Integer) read.readObject();

            System.out.println("Received : " + readInt + " from client");

            write.writeObject((Object) readInt);
            write.flush();

            //break;
        }
        finally {
            write.close();
            read.close();
            clientSocket.close();
            //listener.close();
        }

person Korba    schedule 18.03.2017    source источник
comment
На данный момент сервер еще жив и работает? Возможно, он больше не отвечает.   -  person RichieHindle    schedule 19.03.2017
comment
да. обновленный пост с выводом консоли сервера.   -  person Korba    schedule 19.03.2017


Ответы (1)


Ваш клиент подключается к серверу вне цикла, а ваш сервер закрывает соединение с клиентом внутри цикла.

Это означает, что клиент пытается записать данные в выходной поток, который принадлежит уже закрытому соединению.

person JCasso    schedule 18.03.2017