2016-05-08 3 views
0

Я хочу, чтобы простой серверный сокет принимал клиента и читал некоторые тексты и отключил клиент от себя. В качестве клиента я использую telnet, потому что в будущем я создам специальную программу.Правильно отключить клиент (telnet) от ServerSocket

ServerSocket ss = new ServerSocket(SERVER_SOCKET_PORT); 
    Socket s = ss.accept(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    String line; 
    while (true) { 
     line = reader.readLine(); 
     if (line == null || line == "" || line == "q") { 
      log("-- breaking the loop"); 
      break; 
     } 

     printf("**%s%n", line); 
    } 
    reader.close(); 
    s.close(); 
    ss.close(); 

Проблема, с которой я столкнулся, - это цикл while, который никогда не прерывается.

ответ

1

Во-первых, это не то, как вы сравниваете String (ы) для равенства. Во-вторых, я предпочел бы String.isEmpty() тестированию на равенство с "". Наконец, вы можете использовать try-with-resources до close. Нечто подобное,

try (ServerSocket ss = new ServerSocket(SERVER_SOCKET_PORT); 
     Socket s = ss.accept(); 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(s.getInputStream()))) { 
    String line; 
    while ((line = reader.readLine()) != null) { 
     if (line.isEmpty() || line.equalsIgnoreCase("q")) { 
      System.out.println("-- breaking the loop"); 
      break; 
     } 

     System.out.printf("**%s%n", line); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
1
while (true) { 
    line = reader.readLine(); 
    if (line == null || line == "" || line == "q") { 

Проблема у меня есть цикл, никогда не ломается.

Таким образом, равный никогда не

  • закрывает соединение
  • посылает пустую строку, которая сравнивает с "" ЧЕРЕЗ (неправильное применение) == оператор
  • посылает строку, состоящую только из "q" плюс линейный терминатор.

Обычный способ написать этот цикл будет:

while ((line = reader.readLine()) != null) 
{ 
    if (line.isEmpty() || line == "q") { 
     log("-- breaking the loop"); 
     break; 
    } 

    printf("**%s%n", line); 
} 

Но если партнёр никогда не закрывает соединение или отправляет "q" нет никакого способа, этот цикл будет когда-нибудь выйти. Вы отправили все, что могло бы произвести любое из этих условий?

отключить клиент от себя

Это не имеет смысла. Повторите попытку.

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