Java, розетка, резьба - PullRequest
       4

Java, розетка, резьба

0 голосов
/ 01 февраля 2020

Здравствуйте, уважаемые пользователи StackOverflow. Я прихожу сюда снова, чтобы ответить на вопрос о Java Socket and Thread. Мой текущий код:

new Thread(()->{
             System.out.println("Thread.......");
            try {
                while(true){
                     ServerSocket serverSocket = new ServerSocket(serverPort);
                     Socket socket = serverSocket.accept();
                        final InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
                        BufferedReader br = new BufferedReader(streamReader);
                        String line = null;
                        while ((line = br.readLine()) != null){
                            JsonObject result = new Gson().fromJson(line, JsonObject.class);
                            String token = result.get("serverToken").getAsString();
                            String player = result.get("player").getAsString();
                            String value = result.get("quantity").getAsString();
                            System.out.println(token+"/"+serverToken);
                            if(token.equals(serverToken)){
                                String command = activeCommand;
                                       command = activeCommand.replace("%value%", value);
                                       command = activeCommand.replace("%player%", player);
                                execCommand(command);
                                System.out.println("Acertou a token!");
                            }else{
                                System.out.println("Token incorreta!");
                            }
                        }
                     serverSocket.close();
                     socket.close();
                     Boolean isClosed = socket.isClosed();
                     System.out.print(isClosed);
                  } 
            } catch (IOException e) {
                System.out.println(e);
            }
        }).start();

Хорошо работает, до определенного момента. После нескольких запросов он просто выдает ошибку: java. net .BindException: адрес уже используется (сбой привязки)

Я искал некоторое время, но не нашел решение. Заранее спасибо.

1 Ответ

2 голосов
/ 01 февраля 2020

У меня нет однозначного ответа, но у меня есть возможные проблемы и некоторые улучшения .

  1. Вы не закрываете некоторые закрываемые ресурсы.
  2. Исключение может быть выброшено и не перехвачено в этом потоке.

Улучшения

  1. 4 Все закрываемые объекты помещаются в несколько попыток. with-resources.
  2. Теперь вы используете ThreadFactory, который печатает все необработанные исключения.
  3. Теперь вы печатаете IOException, если оно возникает.
  4. Вы теперь используя ExecutorService, который использует ThreadFactory.
        ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setUncaughtExceptionHandler((thread, throwable) -> throwable.printStackTrace())
                .setNameFormat("my-server-thread")
                .build();

        ExecutorService service = Executors.newSingleThreadScheduledExecutor(threadFactory);

        service.submit(() -> {
            while(true) {
                try (ServerSocket serverSocket = new ServerSocket(port)) {
                    try (Socket socket = serverSocket.accept()) {
                        try (InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
                             BufferedReader br = new BufferedReader(streamReader)) {
                            String line;

                            while ((line = br.readLine()) != null) {
                                // your other code in here
                            }
                        }
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        });
...