如何解决如何在没有错误的情况下停止服务器关闭套接字jav
我制作了一个允许加入许多客户端的服务器。 但是我有一个问题。 我添加了应该启动/停止服务器的启动/停止按钮。但是代码不像我想要的那样工作:
private void btnssActionPerformed(java.awt.event.ActionEvent evt) {
// btnss == botton start stop
if (btnss.getText().equals("START")) {
exit = false;
start();
btnss.setText("STOP");
} else {
addToLogs("Chat server has been stopped");
exit = true;
btnss.setText("START");
try {
stop();
} catch (IOException ex) {
Logger.getLogger(ServerGui.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
public static void start() {
new Thread(new ServerHandler()).start();
}
public static void stop() throws IOException {
if (!serverSocket.isClosed()){
serverSocket.close();
}
}
private static class ServerHandler implements Runnable {
@Override
public void run() {
try {
serverSocket = new ServerSocket(PORT);
addToLogs("Server started on port: " + PORT);
addToLogs("Now waiting for connections");
while (!exit) {
if (connectedClients.size() <= MAX_CONNECTED) {
new Thread(new ClientHandler(serverSocket.accept())).start();
}
}
} catch (Exception e) {
addToLogs("\nError has been occured \n");
addToLogs(Arrays.toString(e.getStackTrace()));
addToLogs("\nExiting");
}
}
}
private static class ClientHandler implements Runnable {
private Socket clientSocket;
private PrintWriter outPutToClient;
private BufferedReader inputFromClient;
private String name;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
addToLogs("Client connected: " + clientSocket.getInetAddress());
try {
inputFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outPutToClient = new PrintWriter(clientSocket.getOutputStream(),true);
for (;;) {
name = inputFromClient.readLine();
if (name == null) {
return;
}
synchronized (connectedClients) {
if (!name.isEmpty() && !connectedClients.keySet().contains(name)) {
break;
} else {
outPutToClient.println("INVALID OR USED NAME");
}
}
}
outPutToClient.println("Welcome to the chat group," + name.toUpperCase() + "!");
addToLogs(name.toUpperCase() + " has joined.");
//function that save messagses
addToLogs2(name);
broadcastMessage("[SYSTEM] " + name.toUpperCase() + " has joined.");
connectedClients.put(name,outPutToClient);
String message;
outPutToClient.println("You may join the chat now...");
while ((message = inputFromClient.readLine()) != null && !exit) {
if (!message.isEmpty()) {
if (message.toLowerCase().equals("/quit")) {
break;
}
broadcastMessage(String.format("[%s] %s",name,message));
// fauction of adds msgs
}
}
} catch (Exception e) {
addToLogs(e.getMessage());
} finally {
if (name != null) {
addToLogs(name + " is leaving");
connectedClients.remove(name);
broadcastMessage(name + " has left");
}
}
}
}
所以我得到了这些错误:
[java.net.DualStackPlainSocketImpl.accept0(Native Method),java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131),java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404),java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199),java.net.ServerSocket.implAccept(ServerSocket.java:545),java.net.ServerSocket.accept(ServerSocket.java:513),server.ServerGui$ServerHandler.run(ServerGui.java:312),java.lang.Thread.run(Thread.java:745)]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。