Java、套接字、线程
亲爱的StackOverflow用户您好。我再次来到这里是为了回答一个关于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
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:地址已在使用中(绑定失败)
我已经找了一段时间了,但还没有找到解决办法。提前谢谢。我没有确切的答案,但我确实有一些可能的问题和一些改进
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();
}
}
});
我没有明确的答案,但我确实有一些可能的问题和一些改进
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不是线程否,但您可以使用可调用的,并且在结果上确保套接字已关闭。我会在下面给出答案。