Выполнение кода (Java, многопоточность) останавливается после строки кода - PullRequest
2 голосов
/ 05 февраля 2012

Я пытаюсь создать чат-сервер-клиентскую программу на Java. Но проблема в том, что после того, как точка в коде останавливает выполнение, я не могу понять почему. Я прилагаю код здесь. Я новичок в многопоточности и программировании сокетов, поэтому, возможно, ошибка совершенно очевидна, но я полностью ее пропускаю.

public class ChatClient implements Runnable
{  private Socket socket              = null;
private Thread thread1              = null;
private ObjectOutputStream streamOut = null;
private ChatClientThread client    = null;
private Message sendMsg = null;
private String username = null;
private DataInputStream console = null;
private Scanner s = new Scanner(System.in);
String text;

public ChatClient(String serverName, int serverPort)
{  System.out.println("Establishing connection. Please wait ...");
   try
     {  socket = new Socket(serverName, serverPort);
     System.out.println("Connected: " + socket);
     System.out.println("Enter your username:");
     username = s.nextLine();
     start();
  }
  catch(UnknownHostException uhe)
  {  System.out.println("Host unknown: " + uhe.getMessage()); }
  catch(IOException ioe)
  {  System.out.println("Unexpected exception: " + ioe.getMessage()); }
}

public void run()
{  while (thread1 != null)
  {  try
     {  sendMsg = new Message();
        sendMsg.setMsg(s.nextLine());
        System.out.println(sendMsg.getMsg()+ " check");
        streamOut.writeObject(sendMsg);
        streamOut.flush();
     }
     catch(IOException ioe)
     {  System.out.println("Sending error: " + ioe.getMessage());
        stop();
     }
  }
}

    public void handle(String user, Message msg)
{  System.out.println("1");
   if (msg.getMsg().equals(".bye"))
  {  System.out.println("Good bye. Press RETURN to exit ...");
     stop();
  }
  else
     System.out.println(msg.getMsg());
   System.out.println("Msg received");
}

   public void start() throws IOException
{   

    //console = new DataInputStream(System.in);
    System.out.println("1");
    streamOut = new ObjectOutputStream(socket.getOutputStream());
    System.out.println("3");

  if (thread1 == null)
  {  client = new ChatClientThread(this, socket, username);
     System.out.println("Started new ChatClientThread");
     thread1 = new Thread(this);                   
     thread1.start();
  }
  else
      System.out.println("This code is stupid.");
  }

   public void stop()
{  if (thread1 != null)
   {  thread1.stop();  
      thread1 = null;
   }
  try
  {  if (console   != null)  console.close();
     if (streamOut != null)  streamOut.close();
     if (socket    != null)  socket.close();
  }
  catch(IOException ioe)
  {  System.out.println("Error closing ..."); }
  //client.close();  
  client.stop();
}

    public static void main(String args[])

 {  ChatClient client = null;
  //if (args.length != 2)
    // System.out.println("Usage: java ChatClient host port");
  //else
     client = new ChatClient("localhost", 2008);
}
 }

Таким образом, он работает следующим образом: он запускается из основной функции, переходит в конструктор, принимает имя пользователя и все остальное и переходит к запуску (). Я предполагаю, что начало работы, потому что это печатает 1 и 3, но после этого я продолжаю вводить текст, но он просто не переходит к следующему пункту (я знаю, что это не печатает "Started new ChatClientThread"). Любая помощь будет оценена. Я работал над этим кодом часами, и я просто не могу понять, почему выполнение останавливается там.

UPDATE

Я изменил код ChatClient.start

    public void start() throws IOException
   {    

    //console = new DataInputStream(System.in);
    System.out.println("1");
    streamOut = new ObjectOutputStream(socket.getOutputStream());
    System.out.println("3");

    if (thread1 == null)
    {  
        System.out.println("Started new ChatClientThread");
        client = new ChatClientThread(this, socket, username);
        System.out.println("Started new ChatClientThread");
        thread1 = new Thread(this);                   
        thread1.start();
    }
    else
        System.out.println("This code is stupid.");
    }

Теперь я знаю, что он действительно запускает конструктор ChatClientThread:

    public ChatClientThread(ChatClient _client, Socket _socket, String uname)
   {  System.out.println("Constructor started");
  client   = _client;
  socket   = _socket;
  username = uname;
  System.out.println("1");
  open();
  System.out.println("2");
  start();
  System.out.println("3");

   }

Он печатает 1, переходит к ChatClientThread.open:

   public void open()
   {  try
  {     streamIn  = new ObjectInputStream(socket.getInputStream());

  }
  catch(IOException ioe)
  {  System.out.println("Error getting input stream: " + ioe);
     client.stop();
  }
  }

Но вот где он снова застревает. Он не переходит к печати 2, поэтому я предполагаю, что он не перемещается в фрагмент кода ChatClientThread.start.

Ответы [ 2 ]

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

Вы переопределили метод start(). НЕ перезаписывайте метод 'start()'. Если вы переопределите метод start(), не забудьте вызвать super.start() в конце метода.

метод start() запустит run().

См. этот вопрос и этот ответ для получения дополнительной информации.

0 голосов
/ 27 июля 2012

Хорошо, я только что прочитал FAQ, и все в порядке, чтобы ответить на ваш собственный вопрос. Так что вот так.

Решение найдено: ObjectInputStream (socket.getInputStream ()); не работает

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