Потоки через сокет - PullRequest
       3

Потоки через сокет

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

Я пишу сервер-клиентское приложение. Клиент отправляет какие-то данные через разные потоки на сервер. Как только я размещаю потоки в основном методе, программа ничего не делает; без исключения просто пустая консоль:

try {
                socket = new Socket("localhost", 4050);                     
                din = new DataInputStream(socket.getInputStream());
                oin = new ObjectInputStream(socket.getInputStream());
                dout = new DataOutputStream(socket.getOutputStream());                     


            } catch (UnknownHostException e) {              
                System.out.println("Exception: the host is unknown");
            } catch (IOException e) {
                System.out.println("I/O exception thrown by socket");
            }

Как только я удаляю этот поток oin = new ObjectInputStream(socket.getInputStream()); из этой части основного метода, программа выдает исключение EOFException или сброс соединения. Что такого особенного в приведенном выше коде, что программа ничего не делает и не выдает никаких исключений?

Как только вы поместите упомянутый поток в отдельный метод

private static MessageObject readObject(){
        MessageObject mo = null;

        try{
             oin = new ObjectInputStream(socket.getInputStream());
             mo = (MessageObject)oin.readObject();

        } 
        catch(IOException e){
            System.err.println(e.getCause());
        }
        catch(ClassNotFoundException e){
            System.err.println(e.getCause());
        }
        return mo;
    }

Выдает это исключение:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.DataInputStream.readBoolean(Unknown Source)
    at Server.main(Server.java:77)

На сервере находится в ветке if:

if (din.readBoolean()) {

        ObjectInputStream oin = new ObjectInputStream(s.getInputStream());
        MessageObject o = (MessageObject)oin.readObject();

        // server saves the whole thing
        MessageDB.add(o);

    }

Я не могу разместить здесь весь свой код, это мое задание.

упс, извините, ошибка найдена. Логическая ошибка: сервер ожидал ввода, но клиент отказывался его отправлять.

1 Ответ

7 голосов
/ 07 марта 2012

Вы делаете несколько ошибок здесь.

  1. Вы используете несколько потоков через один сокет. Не делай этого, они только запутают друг друга. Поскольку вам нужен объект ввода / вывода, просто используйте ObjectInputStream и ObjectOutputStream для всего.

  2. Неправильный порядок строительства. Вы должны построить ObjectOutputStream до ObjectInputStream на обоих концах.

  3. Вы используете потоки с разным временем жизни. Вы еще не решили проблему, но в конечном итоге это приведет к StreamCorruptedException. Используйте одинаковые ObjectInputStream и ObjectOutputStream для срока службы розетки на обоих концах.

  4. Вам, вероятно, также нужно прочитать Javadoc для ObjectOutputStream.reset() и .writeUnshared(), чтобы понять, что они делают, и почему вам может потребоваться позвонить одному или другому из них.

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