Хобрук: Ваш путь к мастерству в программировании

ObjectInputStream и ObjectOutputStream

Я написал EchoServer, который отвечает String ack, если данные были отправлены соответствующим образом.

Мой клиент выглядит так... Чтобы получить ответ подтверждения от сервера, «echoSocket» помещает полученные данные в мой ObjectInputStream. Только если я прокомментирую эти части, клиент работает

        echoSocket = new Socket(server_name, tcp_port);
        System.out.println(" *** Connected to " + server_name  + " ***");
        System.out.println("Press Enter to send your message.");

        out = new ObjectOutputStream(echoSocket.getOutputStream());
        in = new ObjectInputStream(echoSocket.getInputStream());

        out.flush();

        String message = System.console().readLine();

        while(!message.equals("quit")) {


            // problem                
            if (in.readObject().equals(ack)) 
                System.out.println("ACKed");
            in.close();
            // problem ends
            out.flush();

            out.writeObject(message);
            System.out.println("Sending: " + message);      
            message = System.console().readLine();
            out.flush();

        }

Кто-нибудь знает, почему он не отправляет мои строки?

Спасибо, Мариус

22.11.2009

  • Является ли ack строковым литералом? Изменить на: если (in.readObject().equals(ack)) 23.11.2009

Ответы:


1

Использование потоков объектов через сокеты на самом деле не рекомендуется. Вы можете рассмотреть полноценный веб-сервис или RMI.

Это может работать лучше, если вы прочитаете в буфер и убедитесь, что у вас есть весь бизнес, прежде чем пытаться десериализовать потоки объектов.

22.11.2009
  • РМИ очень дорого. Иногда потоки + сокеты — лучшее решение. 23.11.2009
  • Если вы читаете в буфер, не будет работать лучше, тогда вам придется самостоятельно управлять границами объектов. Но вставка BufferedInputStream будет означать меньше вызовов системного вызова чтения на уровне ОС. Подобные тесты часто терпят неудачу из-за блокировки, возникающей при попытке чтения и записи одного и того же канала в одном потоке. 23.11.2009

  • 2

    Почему бы не использовать гессенскую библиотеку?

    Это работает как шарм: http://karussell.wordpress.com/2009/04/10/hessian-web-service-protocol-hello-world-example/

    Или попробуйте весенний удаленный доступ (который не такой легкий)

    http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html

    22.11.2009

    3

    Похоже, что клиент пытается прочитать подтверждение до того, как написал сообщение.

    22.11.2009
  • даже если я меняю порядок, клиент просто останавливается. Ответ необязателен... если ответа нет, он продолжает ждать. 23.11.2009
  • readObject() будет блокироваться до тех пор, пока данные не будут получены. Поэтому, если сервер никогда не подтвердит, вы будете ждать вечно. Вы говорите, что ACK является необязательным... возможно, вы можете объяснить, почему вам нужен ACK, если он не требуется. Как долго вы должны ждать его, прежде чем сдаться? Почему эта петля вообще заботится? 23.11.2009
  • @wishi_ Я предлагаю вам перестать беспорядочно перемещать вещи и ПОДУМАТЬ о том, что происходит. Как говорит @PSpeed, вызов операции чтения для входного потока клиента приведет к его блокировке до тех пор, пока он не получит данные (необязательные или нет) с сервера. 23.11.2009

  • 4

    Разделите «отправляющий» и «получающий» код на отдельные потоки, поток записи может писать в сокет, в то время как ваш другой поток блокируется при вызове readObject().

    Если это будет долгоиграющий клиент, я бы также рекомендовал использовать более низкоуровневые DataInputStream и DataOutputStream вместо ObjectInputStream/ObjectOutputStream, чтобы предотвратить удержание возможно большого IdentityHashmap объектов.

    23.11.2009
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..