данные inputStream потеряны - PullRequest
       4

данные inputStream потеряны

1 голос
/ 25 февраля 2012

Я делаю простой клиент-сервер на Java.Это мой код клиента.

 try {
        socket = new Socket(serverIP, serverport);
        dataStream = new DataOutputStream(new BufferedOutputStream(
                socket.getOutputStream()));
        long[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        for (int i = 0; i < data.length; i++) {
            dataStream.writeLong(data[i]);
            System.out.println("So far" + dataStream.size());
        }
     }
  } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (socket != null)
            try {
                dataStream.flush();
                socket.close();
                dataStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

Это прекрасно работает, потому что я вижу, что на сервер записано монтирование байтов.Вот код сервера.

 try {
            ServerSocket newSocket = new ServerSocket(2503);
            while (true) {
                connectionSocket = newSocket.accept();
                input = new DataInputStream(new BufferedInputStream(connectionSocket.getInputStream()));                
                System.out.println(input.readLong());
            }

Однако ни одна из данных не была успешно прочитана из сокета сервера, connectionSocket.getInputStream.available () возвращает 0 байтов.давайте предположим, что все переменные были объявлены правильно.Есть идеи почему?Ценю помощь.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Очистить / закрыть поток до закрытия сокета.

[Было: очистить / закрыть поток до обновления кода]

0 голосов
/ 25 февраля 2012

Ваш цикл вызывает accept на каждом проходе, который будет блокироваться до следующего клиента. Таким образом, первый клиент подключается, он читает длинный, печатает его, а затем зацикливается на блокировке, ожидая подключения другого соединения. Вы должны переместить это за пределы цикла. Возможно, в отдельном потоке, потому что, если вы выполняете итерацию по потоку в том же потоке, что и прием новых клиентов, вы не сможете подключиться, пока он не завершится с первым клиентом. Это следующий шаг, но вот как вы решаете свою проблему:

try {
   ServerSocket newSocket = new ServerSocket(2503);
   while( !done ) {
       Socket nextClient = newSocket.accept();
       // it's better to start a thread and put the call to this method in there
       // so the thread owning the ServerSocket can loop back around and accept
       // another client should another connect while it's servicing this client
       handleNewClient( nextClient );
   }
} finally {
   newSocket.close();
}

public void handleNewClient( Socket client ) {
   boolean done = false;
   DataInputStream in = new DataInputStream( new BufferedInputStream( client.getInputStream() ) );
   while( !done ) {
      try {
         Long l = in.readLong();
         System.out.println( l );
      } catch( EOFException e ) {
         // this is not a great way to end the conversation from a client.
         // better to either know how much you can read the stream (ie count of bytes), 
         // or use a termination encoding.  Otherwise you have to wait till the client
         // closes their side which throws EOFException.
         done = true;
      }
   }      
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...