【问题标题】:Java, socket, threadJava、套接字、线程
【发布时间】:2020-02-01 00:42:30
【问题描述】:

亲爱的 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: Address already in use (Bind failed)

我一直在寻找一段时间,但我还没有找到解决方案。提前致谢。

【问题讨论】:

  • 你没有关闭大量的 Closeable 对象,你肯定需要这样做。可能是抛出异常并被吞掉,导致套接字未关闭。
  • 线程关闭后是否会触发任何东西来关闭连接? @杰森
  • 不是线程,但您可以使用 Callable 并在结果上确保套接字已关闭。我会在下面得到答案。

标签: java multithreading sockets bukkit


【解决方案1】:

我没有明确的答案,但我确实有一些可能的问题和一些改进

  1. 您没有关闭某些 Closeable 资源。
  2. 可能会引发异常,但未在此线程中捕获。

改进

  1. 4 个可关闭对象全部放入多个 try-with-resources。
  2. 您现在正在使用打印所有未捕获异常的 ThreadFactory。
  3. 您现在正在打印 IOException(如果发生)。
  4. 您现在正在使用一个使用 ThreadFactory 的 ExecutorService。
        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();
                }
            }
        });

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 2016-07-23
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多