Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从服务器端侦听的状态释放端口_Java_Sockets_Exception_Server_Serversocket - Fatal编程技术网

Java 如何从服务器端侦听的状态释放端口

Java 如何从服务器端侦听的状态释放端口,java,sockets,exception,server,serversocket,Java,Sockets,Exception,Server,Serversocket,我不熟悉JAVA中的套接字。最近,我正在尝试构建一个服务器-客户端程序,客户端可以在服务器端从字典中搜索单词,服务器将向客户端返回单词的定义。服务器端的代码如下: public class DictionaryServer { private static int port; private static String dicFile; static Map<String, String> dictionary = new HashMap<String, String>

我不熟悉JAVA中的套接字。最近,我正在尝试构建一个服务器-客户端程序,客户端可以在服务器端从字典中搜索单词,服务器将向客户端返回单词的定义。服务器端的代码如下:

public class DictionaryServer {

private static int port;
private static String dicFile;
static Map<String, String> dictionary = new HashMap<String, String>();
int userCounter = 0;

public static void main(String[] args) {

    //check if starting the server in valid format
    if (args.length != 2) {
        System.err.println("Invalid format to start DictionaryServer"); 
        System.err.println("Usage: java DictionaryServer <port number> <the name of dictionary>");
        System.exit(1);
    }


    port = Integer.parseInt(args[0]);
    dicFile = args[1];


    try{
        System.out.println("IP: " + InetAddress.getLocalHost());
        System.out.println("port: " + port);
    }
    catch(UnknownHostException e){
        e.printStackTrace();
    }
    DictionaryServer s = new DictionaryServer();
    s.server(port, dicFile);

}


public void server(int port, String dicFile) {
    ServerSocketFactory serverSocket = ServerSocketFactory.getDefault();

    try(ServerSocket server = serverSocket.createServerSocket(port)){

        System.out.println("Server IP: " + server.getInetAddress());
        System.out.println("Listening for client connections...");

        while(true){
            Socket client = server.accept();
            System.out.println("Client \"" + client.getRemoteSocketAddress().toString()
                    + "\""+ " is connecting.");


            Thread t = new Thread(() -> service(client, dicFile));
            t.start();

        }
    }
    catch (UnknownHostException e) {
        e.printStackTrace();
    }
    catch(IOException e) {
        e.printStackTrace();
    }

}

public void service(Socket client, String dicFile){
    try(Socket clientSocket = client){
        // Input and Output stream of the client
        DataInputStream input = new DataInputStream(
                clientSocket.getInputStream());
        DataOutputStream output = new DataOutputStream(
                clientSocket.getOutputStream());

        //check request
        int action = input.readInt();   //1:add, 2:remove, 3:query
        String word = input.readUTF();

        //choose action
        Dic d = new Dic(dicFile);
        switch(action){
            case 1: //add
                String definition = input.readUTF();
                output.writeUTF(d.add(word, definition, dicFile));
                break;

            case 2: //remove
                output.writeUTF(d.remove(word, dicFile));
                break;

            case 3: //query
                output.writeUTF(d.query(word, dicFile));
                break;
        }
    }
    catch(IOException e){
        String message=e.getMessage();
        System.out.println(message);
        System.out.println();
    }   
}   

有人知道我如何解决这个问题吗?谢谢大家!

您需要确保您的程序已真正退出,并且还需要设置
reuseAddress
。为此,您必须在不绑定的情况下创建服务器套接字,设置选项,然后通过三个不同的步骤绑定它:

ServerSocket server = serverSocketFactory.createServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(port));

一旦应用程序终止,端口最终由操作系统释放。这只是需要一些时间。您必须关闭以前运行的服务器,或者在运行时将您的端口配置为不同的应答路径。但我已经等了很长时间,但他们仍然在听。我是否可以在退出服务器程序时通过添加一些代码来终止它们?不,唯一有效的方法是关闭我的Eclipse。当其他非守护进程线程仍在运行时,杀死主线程不会杀死整个JVM。尝试
Thread.setDaemon(true)
。有关更多信息,请参阅
ServerSocket server = serverSocketFactory.createServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(port));