【问题标题】:How to close a server port after we are done using it?使用完毕后如何关闭服务器端口?
【发布时间】:2015-02-14 10:47:54
【问题描述】:

注意:我在这里发现了一个类似的问题:

How to close port after using server sockets

但是没有找到满意的答案。

这是我的客户端程序代码:

package hf;

import java.io.*;
import java.net.*;

public class DailyAdviceClient 
{
    private static final int chatPort = 4242;
    public static void main(String[] args)
    {
        DailyAdviceClient client = new DailyAdviceClient();
        client.go();
    }

    private void go()
    {
        try
        {
            Socket socket = new Socket("127.0.0.1",chatPort);
            InputStreamReader inputStream = new InputStreamReader(socket.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(inputStream);

            String advice = bufferedReader.readLine();
            System.out.println("Advice received by the client for today is "+advice);

            bufferedReader.close();
        }
        catch(Exception e)
        {
            System.out.println("Failed to connect to the server");
        }
    }
}

这是服务器程序的代码:

package hf;

import java.io.*;
import java.net.*;

public class DailyAdviceServer 
{
    private String[] adviceList = {"Take smaller bites",
            "Go for the tight jeans. No they do NOT make you look fat.",
            "One word: inappropriate", 
            "Just for today, be honest. Tell your boss what you *really* think", 
            "You might want to rethink that haircut."};
    private static final int chatPort = 4242;

    public static void main(String[] args)
    {
        DailyAdviceServer server = new DailyAdviceServer();
        server.go();
    }

    private void go()
    {
        try
        {
            ServerSocket serverSocket = new ServerSocket(chatPort);

            while(true)
            {
                Socket socket = serverSocket.accept();

                PrintWriter writer = new PrintWriter(socket.getOutputStream());

                String advice = getTodaysAdvice();

                writer.println(advice);
                writer.close();
            }
        }
        catch(Exception e)
        {
            System.out.println("Error in establishing connection with the client");
        }
    }

    private String getTodaysAdvice()
    {
        String advice = null;

        int randomIndex = (int) (Math.random()*adviceList.length);
        advice = adviceList[randomIndex];
        return advice;
    }
}

在应用程序中,每当客户端程序连接到服务器程序时,它都会收到一个包含当天建议的字符串。

当我跑步时

netstat -an

在我的 Windows 计算机的命令提示符中,如上述链接中的一个答案所建议的那样,我收到一条消息,端口 4242 是

LISTENING

如何关闭端口并使其可供将来重复使用?

【问题讨论】:

  • 只要服务器在运行,端口就会打开,直到有人停止服务器。完成读取或写入后,您应该使用 socket.close() 关闭服务器和客户端的套接字;但是这行 ServerSocket serverSocket = new ServerSocket(chatPort);将始终保留服务器使用的端口
  • @MihaiC 不,不会。它将一直监听,直到服务器套接字关闭或进程退出。 “总是”是很长的时间。
  • @Luke OMG 另一个。那不是仅链接的答案。你读了吗?
  • @EJP 这正是我所说的。 “直到有人停止服务器”= 进程退出,并且“ServerSocket serverSocket = new ServerSocket(chatPort);”将保持打开状态,直到 serversocket 关闭...
  • @MihaiC '将始终保留该服务器使用的端口' '正是你所说的',这正是我所评论的。

标签: java sockets networking server


【解决方案1】:

你必须在关闭writerbufferedReader后使用socket.close()。因此,该端口将可以进行另一次通信。

【讨论】:

  • 您不必“在关闭写入器和缓冲读取器后使用socket.close()”,因为关闭任何一个都会关闭另一个和套接字,并且无论您关闭端口都可用于另一个通信那个插座与否。
【解决方案2】:

要摆脱 LISTENING 端口,您必须调用 serverSocket.close().

【讨论】:

  • ,只要我运行服务器端程序,我希望端口处于活动状态。然后希望端口被释放一次,我已经停止运行服务器端程序。我将无法在我的服务器端程序中放入 serverSocket.close() 行,因为这意味着服务器端程序会自行停止运行,而不是在运行期间一直可用。我已经通过 Eclipse IDE 运行了它。IDE 中的控制台没有显示任何正在运行的程序,即使选择的编辑器窗口是服务器端程序,这让我认为它已经终止。
  • 因此,该端口似乎仍在 LISTENING 中,尽管已被终止。我有 4 个问题。1) 有没有什么地方可以在程序中放入 serverSocket.close() 而不影响服务器端程序所需的功能?2) 终止服务器端程序是否显式释放端口?3)如何终止/停止服务器端程序在 Eclipse IDE 中运行?4)我如何知道程序是否终止?(正如我之前提到的,控制台显示消息终止。但如果是这样的话,那么我不明白为什么端口仍在侦听)
  • 续...服务器端程序已终止。
  • 我已经回答了你的问题。在进程退出或关闭ServerSocket. 之前,端口将一直在监听。只有您知道何时要这样做。
  • 如果我在服务器端代码中不包含 serverSocket.close() 并且想从外部显式终止进程,我该如何在 Eclipse IDE 中执行此操作?如果我选择包含服务器端代码代码的选项卡,它不会显示代码仍在运行,尽管它是。请你告诉我如何阻止服务器端程序显式运行。
猜你喜欢
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2023-03-15
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多