2013-12-10 4 views
0

Вот мой класс сервера, а также Admin/Client ... Администратор может получить исходное сообщение с сервера, но не может ответить на сервер. Создается серверный сокет, и когда администратор подключается к серверу, сообщение Сервера получает и печатает. Хотя после распечатки меню сервера («1. Вход и т. Д.»). Я не могу ввести опцию через консоль. Кажется, что он находится в тупике, как только администратор распечатает меню, отправленное с сервера.Не удается связаться с сервером от клиента

/** 
    A server that executes the Simple Bank Access Protocol. 
*/ 
public class BankServer extends Thread { 

private Socket sAdmin; 
private Scanner inServer; 
private PrintWriter outServer; 

public static void main(String[] args) throws IOException { 
    Bank bank = new Bank(10); 
    ServerSocket server = new ServerSocket(8888); 
    System.out.println("Waiting for clients to connect..."); 
    Thread admin = new BankServer(); 
    admin.start(); 
    while (true) { 
     Socket s = server.accept(); 
     System.out.println("Client connected."); 
     BankService service = new BankService(s, bank); 
     Thread t = new Thread(service); 
     t.start(); 
    } 
} 

@SuppressWarnings("resource") 
public void run() { 
    try { 
     ServerSocket server = new ServerSocket(8889); 
     try { 
      System.out.println("Waiting for admin to connect..."); 
      while (true) { 
       sAdmin = server.accept(); 
       System.out.println("Admin connected."); 
       InputStream instream = sAdmin.getInputStream(); 
       OutputStream outstream = sAdmin.getOutputStream(); 
       inServer = new Scanner(instream); 
       outServer = new PrintWriter(outstream); 
       outServer.print(...+"1. Login\n"+etc...); 
       outServer.flush(); 
       findCommand(); 
      } 
     } finally { 
      sAdmin.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void findCommand() throws IOException { 
    while (true) { 
     if (!inServer.hasNext()) { 
      return; 
     } 
     String command = inServer.next(); 
     String chosenCommand; 
     switch (command) { 
      case "1": 
       chosenCommand = "LOGIN"; 
       runCommand(chosenCommand); 
       break; 
      case "2": 
      etc... 
     } 
    } 
} 
... 
} 

Ive удалил метод runCommand и некоторые поля, которые не создают проблем, позволяющих упростить чтение.

Это класс администратора. Он выведет параметры, отправленные с сервера, но не выйдет из цикла вывода сообщения intial и разрешит мне ввести выбор.

public class BankAdmin { 
public static void main(String[] args) throws IOException { 
    Socket inAdmin = new Socket("localhost", 8889); 
    InputStream instream = inAdmin.getInputStream(); 
    OutputStream outstream = inAdmin.getOutputStream(); 
    Scanner in = new Scanner(instream); 
    PrintWriter adminOut = new PrintWriter(outstream); 
    Scanner console = new Scanner(System.in); 

    while (true) { 
     if (!in.hasNextLine()) { 
      String command = console.next(); 
      System.out.println("Sending: " + command); 
      adminOut.print("command"); 
      adminOut.flush(); 
     } else { 
      String response = in.nextLine(); 
      System.out.println(response); 
     } 
    } 
} 
} 
+1

слишком много коды, слишком широкой проблемы. Пожалуйста, подумайте о сокращении кода и более конкретной проблеме. – taxeeta

+0

удалил метод, надеюсь, сделать его более простым для чтения. – user2994739

+0

', но не может ответить на сервер. Откуда вы знаете? Вы получили сообщение об ошибке? Он посылает, но клиент так и не получил? – John3136

ответ

0

Это то, что происходит:

После того как сервер отправляет меню клиента, клиент застревает в in.hasNextLine(). Это связано с тем, что in.hasNextLine() блокирует (приостанавливает) ввод, ожидая появления новой строки (иначе он не может определить, будет ли следующая строка). Чтобы устранить эту проблему, вы должны использовать потоки с ожиданием ввода, а другой - с консоли.

Для получения дополнительной информации см Javadoc on Scanner.hasNextLine()

+0

hmm, было бы лучше, если бы я использовал другой поток с моим администратором? Или возможно прочитать вход сервера с чем-то иным, чем hasNextLine()? – user2994739

+0

Используйте нить. Потому что вы не можете сказать, будет ли сервер отправлять новую строку до тех пор, пока это не произойдет (программы Java действительно плохо прогнозируют будущее). И это не только сканер – MultiplyByZer0

Смежные вопросы