2017-02-16 27 views
-1

Я создаю программу, в которой сервер может получать сообщения от нескольких клиентов. Клиенты создадут соединение и нажав кнопку, отправив информацию, а затем закроют соединение (а не прямую и прямую чат-программу).Java-сообщение, не отправляемое на сервер, если только предыдущий экземпляр клиента не закрыт

Проблема, с которой я столкнулся сейчас, заключается в том, что я запускаю класс программы сервера, а затем дважды запускаю клиентскую программу (для имитации подключения двух пользователей). Однако, когда я отправляю информацию о классе клиента, созданном 2-м, он не будет проходить или обрабатываться до тех пор, пока 1-й клиент не будет закрыт.

Это также мой первый раз, используя сокеты и темы, так что любые советы относительно того, что я делаю неправильно был бы оценен

Я просто призывающие методы прямо сейчас через статическую недействительных сеть

new Server().runServer(); 

public void runServer() throws SocketException, IOException{ 
    serverSocket = new ServerSocket(PORT); 
    System.out.println("Server up"); 

    while(true){ 
     Socket socket = serverSocket.accept(); 
     new ServerThread(socket).run(); 
    } 
} 

public class ServerThread extends Thread{ // 
    Socket socket; 
    ServerThread(Socket socket){ 
    this.socket = socket; 
    } 

    @Override 
    public void run(){ 
     try { 
      String message = null; 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      while ((message = bufferedReader.readLine()) != null){ 
        Server.addToQueue(message); 
      } 
     } catch (IOException ex) { 
     } finally{ 
      try { 
       if (socket != null) 
        socket.close(); 
      } catch (IOException ex) { 
      } 
     } 
    } 
} 

} клиентский код выглядит следующим образом:

public class Client { 
    public static void main(String[]args){ 
     sendToServer(); 
    } 
public static void sendToServer(){ 
    String readerInput; 
    Socket socket = null; 
    PrintWriter printWriter = null; 
    try { 
     socket = new Socket("localhost", 4444); 
     printWriter = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 
     readerInput = bufferedReader.readLine(); 
     printWriter.println(readerInput); 
    } catch (IOException ex) { 
    } finally{ 
     try { 
      socket.close(); 
     } catch (IOException ex) { 
     } 
    } 
} 

}

ответ

0

Вы неправильно задали проблему. Сообщение отправлено все в порядке, но это не получил, из-за ошибки в вашем сервере:

new ServerThread(socket).run(); 

Это должно быть:

new ServerThread(socket).start(); 

В настоящее время сервер не мульти - это исправлено, поэтому он может обрабатывать только одного клиента за раз.

+0

спасибо mate :) это сработало, думаю, мне нужно искать поток больше, а не следовать учебникам – bamramjam

+0

В каком учебнике вы нашли, что использовали 'Thread.run()'? – EJP

+0

Я думаю, что это была комбинация нескольких случайных Java-чатов, которые я смотрел на YouTube. Однако я думаю, что они могли использовать инструменты Runnable вместо продолжения Thread, поэтому я, возможно, запутался в запуске с запуском ¬_¬ – bamramjam

0

Звонок new ServerThread(socket).run() не запускает отдельный поток, но вместо этого выполняет run-метод в текущем потоке. Вот почему связь со вторым клиентом не происходит до того, как первый клиент отключится. Для создания отдельных потоков вам нужно будет использовать start() вместо run().

+0

спасибо mate :) это сработало, думаю, мне нужно искать поток больше, а не следовать учебникам – bamramjam