Java、套接字、线程

Java、套接字、线程,java,multithreading,sockets,bukkit,Java,Multithreading,Sockets,Bukkit,亲爱的StackOverflow用户您好。我再次来到这里是为了回答一个关于Java套接字和线程的问题。 我当前的代码: new Thread(()->{ System.out.println("Thread......."); try { while(true){ ServerSocket serverSocket = new ServerSocket(serverP

亲爱的StackOverflow用户您好。我再次来到这里是为了回答一个关于Java套接字和线程的问题。 我当前的代码:

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:地址已在使用中(绑定失败)


我已经找了一段时间了,但还没有找到解决办法。提前谢谢。

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

  • 你没有关闭一些可关闭的资源
  • 此线程中可能会引发异常,但不会捕获该异常
  • 改进

  • 4个可关闭对象全部放入多个资源中
  • 您现在使用的是打印所有未捕获异常的ThreadFactory
  • 如果发生IOException,您现在正在打印IOException
  • 您现在使用的是使用ThreadFactory的Executor服务
  • ThreadFactory ThreadFactory=new ThreadFactoryBuilder()
    .setUncaughtExceptionHandler((线程,thread,throwable)->throwable.printStackTrace()
    .setNameFormat(“我的服务器线程”)
    .build();
    ExecutorService=Executors.newSingleThreadScheduledExecutor(线程工厂);
    服务提交(()->{
    while(true){
    try(ServerSocket-ServerSocket=newserversocket(端口)){
    try(Socket=serverSocket.accept()){
    try(InputStreamReader streamReader=新的InputStreamReader(socket.getInputStream());
    BufferedReader br=新的BufferedReader(streamReader)){
    弦线;
    而((line=br.readLine())!=null){
    //你的其他代码在这里
    }
    }
    }
    }捕获(ioe异常ioe){
    ioe.printStackTrace();
    }
    }
    });
    
    我没有明确的答案,但我确实有一些可能的问题和一些改进

  • 你没有关闭一些可关闭的资源
  • 此线程中可能会引发异常,但不会捕获该异常
  • 改进

  • 4个可关闭对象全部放入多个资源中
  • 您现在使用的是打印所有未捕获异常的ThreadFactory
  • 如果发生IOException,您现在正在打印IOException
  • 您现在使用的是使用ThreadFactory的Executor服务
  • ThreadFactory ThreadFactory=new ThreadFactoryBuilder()
    .setUncaughtExceptionHandler((线程,thread,throwable)->throwable.printStackTrace()
    .setNameFormat(“我的服务器线程”)
    .build();
    ExecutorService=Executors.newSingleThreadScheduledExecutor(线程工厂);
    服务提交(()->{
    while(true){
    try(ServerSocket-ServerSocket=newserversocket(端口)){
    try(Socket=serverSocket.accept()){
    try(InputStreamReader streamReader=新的InputStreamReader(socket.getInputStream());
    BufferedReader br=新的BufferedReader(streamReader)){
    弦线;
    而((line=br.readLine())!=null){
    //你的其他代码在这里
    }
    }
    }
    }捕获(ioe异常ioe){
    ioe.printStackTrace();
    }
    }
    });
    
    您没有关闭大量可关闭的对象,您肯定需要关闭。有可能抛出并吞没了异常,导致套接字无法关闭。是否有任何东西会在线程关闭后立即触发以关闭连接@JASON不是线程否,但您可以使用可调用的,并且在结果上确保套接字已关闭。我将在下面给出一个答案。你没有关闭一大堆可关闭的对象,你肯定需要关闭。有可能抛出并吞没了异常,导致套接字无法关闭。是否有任何东西会在线程关闭后立即触发以关闭连接@JASON不是线程否,但您可以使用可调用的,并且在结果上确保套接字已关闭。我会在下面给出答案。