Фрейм Java Socket Programming не отвечает на запросы и зацикливается - PullRequest
0 голосов
/ 18 октября 2018

Я впервые пытаюсь программировать сокеты, пробую коды от https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/SocketProgramming/SocketProgram.html и внедряю их во фрейм.Клиенты могут подключаться к серверу, но есть некоторые проблемы с моим фреймом сервера, так как он не отвечает.И обработчик запросов подходит для первого использования для каждого клиента и не работает для следующего запроса.Я замечаю, что обработчик выглядит как цикл, который я не знаю, почему это происходит.

Как сервер реагирует на запрос

Вот как язапустить сервер

private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            server = new ServerSocket(8005);
            executor = Executors.newFixedThreadPool(5);
            System.out.println("Waiting for clients");
            while (true) {
                socket = server.accept();
                Runnable worker = new RequestHandler(socket);
                executor.execute(worker);
                System.out.println("check executor");
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally{
            if(executor!=null){
                executor.shutdown();
            }
        }
    }   

Обработчик запросов

public class RequestHandler implements Runnable {
  private Socket socket;
  ServerSocket server = null;

  public RequestHandler(Socket socket) {
    this.socket = socket;
  }

  @Override
  public void run() {
    try {
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

      String userInput = in .readLine();
      while (userInput != null) {
        System.out.println("Received Message from " + Thread.currentThread().getName() + ": " + userInput);
        jtaLog.append("Received Message from " + Thread.currentThread().getName() + ": " + userInput);
        writer.write("You write : " + userInput);
        writer.newLine();
        writer.flush();
      }
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}

А из клиентской программы запрос сделан так:

private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {
  try {
    String message = tfMessage.getText();

    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    out.println(message);
    jtaLog.append( in .readLine() + "\n");
  } catch (Exception e) {
    System.out.println(e);
  }
}
...