繁体   English   中英

如何重新打开Java套接字

[英]How to reopen a Java socket

我正在循环读取Java Socket。

如果读取引发异常,我想重新打开套接字。

为了测试这一点,我只是关闭套接字并捕获异常。

问题是,当我尝试重新打开套接字时:

serverSocket = new ServerSocket(port)
socket = serverSocket.accept()

它抛出一个异常:

java.net.BindException: The socket name is already in use

这是测试的直接问题。 但是它也可能在生产中发生。

引发异常后,如何通过打开新的套接字连接来可靠地恢复?

如果您误会了您的意思,对不起。

如果套接字上的read()方法失败,则不会关闭ServerSocket。

您仍然应该能够调用serverSocket.accept()而不创建一个新的。 我认为这就是为什么您得到BindException的原因。

您需要创建一次ServerSocket,然后将任何可接受的套接字传递给其处理程序-通常是在其他线程中完成。

您收到的错误是因为您试图在同一端口上侦听两次,这是不可能的。

本文可能会为您提供帮助。 这是代码示例之一:

public void await() {
    ServerSocket serverSocket = null;
    int port = 8080;
    try {
        serverSocket =  new ServerSocket(port, 1,
        InetAddress.getByName("127.0.0.1"));
    }
    catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // Loop waiting for a request
    while (!shutdown) {
        Socket socket = null;
        InputStream input = null;
        OutputStream output = null;
        try {
            socket = serverSocket.accept();
            input = socket.getInputStream();
            output = socket.getOutputStream();

            // create Request object and parse
            Request request = new Request(input);
            request.parse();

            // create Response object
            Response response = new Response(output);
            response.setRequest(request);
            response.sendStaticResource();

            // Close the socket
            socket.close();

            //check if the previous URI is a shutdown command
            shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
        }
        catch (Exception e) {
            e.printStackTrace();
            continue;
        }
    }
}

我发现可以工作的是:

  1. 关闭ServerSocket
  2. 创建一个新的ServerSocket

关闭ServerSocket之后无需延迟。 那是在IBM AIX机器上-也许在其他平台上的行为是不同的。

无需关闭套接字。

我还向套接字添加了超时,以从连接的另一端恢复。 这是在启动和异常时运行的代码:

if (serverSocket != null) serverSocket.close();
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
socket.setSoTimeout(TIMEOUT);
is = socket.getInputStream();

也感谢您提供关闭ServerSocket的提示。 那使我走上了正轨。 并提供有用的网络编程参考。

在连接会话期间引发异常时,应该关闭套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM