gpt4 book ai didi

java.nio.channels.ServerSocketChannel 未正确关闭

转载 作者:太空宇宙 更新时间:2023-11-04 14:58:50 26 4
gpt4 key购买 nike

我有一个java.nio.channels.ServerSocketChannel,我初始化如下:

while(true)
{
ServerSocketChannel channel = ServerSocketChannel.open();
InetSocketAddress serverSocket = new InetSocketAddress(host,port);
channel.bind(serverSocket);
SocketChannel ch = channel.accept();

// Later on when I have read off data from a client, I want to shut this
// connection down and restart listening.
channel.socket().close(); //Just trying to close the associated socket
// too because earlier approaches failed
channel.close();
}

当我从客户端发送第一条消息时,它已成功传递到服务器并且客户端程序退出。然后麻烦就开始了。当我再次初始化客户端并尝试与我第一次建立相同的服务器端口和地址,我得到一个

java.net.BindException: Address already in use: connect

即使我关闭了关联的 channel /套接字,也会出现异常。我一直在更新 ServerSocketChannelInetSocketAddress 对象,因为由于我的客户端实例必须在写入后关闭,所以我必须断开该 channel ,而且之后我无法重用 channel 它已关闭,我每次都必须创建一个新对象。我的理论是,由于 channel 引用每次都会重新分配,孤立对象就变成了 GC 的肉,但由于 close() 方法显然无法正常工作, channel 仍然存在,直到 GC 收集它为止端口将被占用。尽管如此,我尝试在 while 循环之前保留 ServerSocketChannelInetSocketAddress 对象的初始化,但这没有帮助,并且与以前一样,在第一次写入后发生了相同的异常。

 ServerSocketChannel channel = ServerSocketChannel.open();
InetSocketAddress serverSocket = new InetSocketAddress(host,port);
channel.bind(serverSocket);

while (true)
{
SocketChannel ch = channel.accept();
//read from a client
}

为了清楚起见,以下是我从客户端连接的方式:

        SocketChannel ch=SocketChannel.open();
ch.bind(new InetSocketAddress("localhost", 8077));
InetSocketAddress address=new InetSocketAddress("localhost",8079);
//the address and port of the server
System.out.print(ch.connect(address));
ByteBuffer buf=ByteBuffer.allocate(48);
buf.clear();
buf.put("Hellooooooooooooooooooooooooo".getBytes());
buf.flip();
while(buf.hasRemaining()) {
ch.write(buf);
}
ch.close();

最佳答案

看来您混淆了客户端和服务器。通常,服务器仅启动一次并绑定(bind)到 s 端口。通常,不需要关闭任何东西,因为程序退出时端口会被释放。显然,您必须关闭通过 ServerSocket.accept() 获得的 Socket,但那是另一个故事了。

我猜您对变量名称感到困惑(就像我开始时发生的那样)。尝试根据所有事物的类型来调用它们,匈牙利语对我来说真的很有帮助。

<小时/>

code我为测试而写的这篇文章又长又愚蠢又无聊。但它似乎有效。

关于java.nio.channels.ServerSocketChannel 未正确关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com