DataInputStream из сокета - PullRequest
       19

DataInputStream из сокета

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

Обновление - переход к согласованному типу при условии решения

Клиент отправляет сообщение в сокет сервера, затем сервер отвечает клиенту исходным сообщением.При введении последней функциональности сервер получает только одно сообщение, а не продолжает получать указанные сообщения, и не отвечает клиенту.Прокомментировал добавленные строки.Любое понимание зависания было бы замечательно.

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

{  private Socket socket              = null;
   private BufferedReader  console   = null;
   private DataInputStream  streamIn   = null;
   private DataOutputStream streamOut = null;

  while (!line.equals(".bye"))
  {  try
     {  line = console.readLine();
        streamOut.writeUTF(line); //Send console data to server socket
        String reply = streamIn.readUTF(); //Recieve confirmation msg from server
        System.out.println( reply ); //Print the msg
        streamOut.flush();
     }

   public void start() throws IOException
   {  console = new BufferedReader(new InputStreamReader(System.in)); //Changed console to BufferedReader
      streamIn  = new DataInputStream(socket.getInputStream());
      streamOut = new DataOutputStream(socket.getOutputStream());
   }
   public void stop()
   {  try
      {  if (console   != null)  console.close();
         if (streamOut != null)  streamOut.close();
         if (streamIn != null)  streamIn.close(); //Is it good practice to close
         if (socket    != null)  socket.close();
      }

Серверная часть, проблемы прокомментированы.

   public void handleClient() throws IOException {
      boolean done = false;
      try {
      System.out.println("Server Thread " + ID + " running.");
      while (!done) {
        String nextCommand = streamIn.readUTF();
        if( nextCommand.equals(".bye") ) {
           System.out.println("Client disconnected with bye.");
           done = true;
        } else {
           System.out.println( nextCommand );
           String nextReply = "\"You sent me ->" +nextCommand.toUpperCase() + "\"\n";
           streamOut.writeUTF( nextReply );
        }
     }
   } finally {
     streamIn.close();
     streamOut.close();
     socket.close();
   }
   }
   public void open() throws IOException
   {
      streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
      streamOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//      streamOut = new DataOutputStream(socket.getOutputStream());
  }
   public void close() throws IOException
   {  if (socket != null)    socket.close();
      if (streamIn != null)  streamIn.close();
      if (streamOut != null) streamOut.close();
   }

1 Ответ

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

Вы используете writeUTF и readUTF, но в одном месте streamIn.readLine (), который я бы ожидал заблокировать, так как он ожидает новой строки.Я подозреваю, что вы должны использовать readUTF последовательно.

Кстати, консоль не является потоком данных, ее текст, и я предлагаю вам использовать BufferedReader.

...