Несколько потоков ввода / вывода в Java? - PullRequest
1 голос
/ 05 декабря 2011

Я столкнулся с проблемой при использовании потоков ввода / вывода в Java. Я думал о том, чтобы иметь DataInputStream для обработки принимаемого текста и PrintStream для передачи сообщений на сервер от сервера и потоков объектов (вывода / ввода) для обработки проходящих движений фигуры и текущего изображения доски.

Моя проблема в том, что код зависает при попытке создать ObjectInputStream в приведенном ниже коде. Это потому, что я пытаюсь иметь несколько входных и выходных потоков? Если да, то есть ли какое-нибудь исправление, которое я мог бы использовать?

       Socket sock = new Socket("127.0.0.1", 1716);
       input = new DataInputStream(sock.getInputStream());
       printer = new PrintStream(sock.getOutputStream());

       System.out.println("Test 1");
       zelda = new ObjectInputStream(sock.getInputStream());
       System.out.println("Test 2");
       link = new ObjectOutputStream(sock.getOutputStream());
       System.out.println("Test 3");

У меня много ссылок на Legend of Zelda в исходном коде моего сервера, и код довольно большой. Предыдущий исходный код предназначен для клиента, и хотя сервер подключается здесь, я вызываю ObjectOutputStream.

    ObjectOutputStream ganandorf;

    for(int i = 0; i < clients.size(); i++)
    {
       try
       {
            ganandorf = new ObjectOutputStream(clients.get(i).getOutputStream());
            ganandorf.write(1);
            ganandorf.flush();
            ganandorf.writeObject(something);
            ganandorf.flush();
       }

Ответы [ 4 ]

2 голосов
/ 06 декабря 2011

Не пытайтесь использовать два разных вида потоков / считывателей / писателей в одном и том же базовом соединении.Вы столкнетесь с проблемами буферизации на обоих концах, которые делают это в принципе невозможным.

Я бы использовал ObjectInputStream и ObjectOutputStream и просто записывал объекты.

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

0 голосов
/ 02 декабря 2014

Откройте сокет на другом порту и используйте его для создания новых потоков.

0 голосов
/ 06 декабря 2011

Я никогда не узнавал, что случилось с ObjectInputStream , но я переключился на DataInputStream, и в настоящее время я изменяю свой код, чтобы он отправлял имя фрагмента, местоположение x и местоположение y в одной строке, которая получит будет разбит на клиенте, и доска будет изменена соответственно

0 голосов
/ 05 декабря 2011

Я думаю, вы можете запросить только одну ссылку inputStream:

InputStream baseInputStream = sock.getInputStream();
input = new DataInputStream(baseInputStream);
zelda = new ObjectInputStream(baseInputStream);

То же самое относится и к outputStreams

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