Исключение в потоке при отключении клиента - PullRequest
0 голосов
/ 01 марта 2012

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

Исключение в потоке "Поток"-1 "java.lang.NullPointerException в ChatServerThread.handleClient (ChatServerThread.java:31) в ChatServerThread.run (ChatServerThread.java:17)

Он начал проявлять это поведение после того, как я преобразовал из чтения /writeUTF () для readLine () и writeByte () соответственно, и сервер отвечает клиенту тем, что отправил клиент.Подробнее см. Исключение в потоке .

Вопрос в том, как заставить EOFException работать снова, чтобы клиент закрыл соединение. печатается в сообщении об исключении,Строка 31: if( nextCommand.equals(".bye") ) {

import java.net.*;
import java.io.*;

//public class ChatServerThread implements Runnable
public class ChatServerThread extends Thread
{  private Socket          socket   = null;
   private ChatServer      server   = null;
   private int             ID       = -1;
   private BufferedReader streamIn =  null;
   private DataOutputStream streamOut = null;

   public ChatServerThread(ChatServer _server, Socket _socket)
   {  server = _server;  socket = _socket;  ID = socket.getPort();
   }
   public void run() {
   try {
       handleClient();
   } catch( EOFException eof ) { \\This does not seem to be working now and it previously was
        System.out.println("Client closed the connection.");
   } catch( IOException ioe ) {
        ioe.printStackTrace();
   }
}

   public void handleClient() throws IOException {
      boolean done = false;
      try {
      System.out.println("Server Thread " + ID + " running.");
      while (!done) {
        String nextCommand = streamIn.readLine();
        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.writeBytes ( nextReply );
        }
     }
   } finally {
     streamIn.close();
     streamOut.close();
     socket.close();
   }
   }
   public void open() throws IOException
   {
      streamIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      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 Ответ

2 голосов
/ 01 марта 2012

Исключение выдается из второй строки:

String nextCommand = streamIn.readLine();
if( nextCommand.equals(".bye") ) {

Очевидно, nextCommand равно null.streamIn - это BufferedReader, цитируя JavaDoc: readLine():

Возвращает:

A Строка, содержащая содержимоестроки, не включая символы окончания строки, или ноль, если достигнут конец потока

Это другое поведение по сравнению с DataInputStream.readUTF():

Возвращает:

строка Юникода.

Броски:

EOFException - еслиэтот входной поток достигает конца перед чтением всех байтов.

Я предполагаю, что Ctrl + C прерывает блокировку readLine() и сигнализирует об окончании потока,

...