java - 检查端口是否已绑定并在 Java 中侦听;“重置”一个 SocketChannel?
问题描述
class CheckServerStarted implements Closeable
{
private final SocketChannel channel;
private final InetSocketAddress address;
private boolean connStarted = false;
public CheckServerStarted(InetSocketAddress address) throws IOException
{
channel = SocketChannel.open();
channel.configureBlocking(false);
this.address = address;
}
/**
* @throws IOException
*
*/
private void startConn() throws IOException
{
channel.connect(address);
connStarted = true;
}
private boolean check(int timeout, boolean retry)
{
for (int i = 0; i < timeout; i++)
{
try
{
final boolean justStarted = !connStarted;
if (justStarted)
{
startConn();
}
if (justStarted || (i > 0))
{
// Wait a second between attempts/give the connection some time to get established.
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
}
if (channel.finishConnect())
{
System.out.println("Server started - accepting connections on " + address.toString());
return true;
}
}
catch (IOException e)
{
System.out.println("Connect attempt failed : " + e.getMessage());
if (!retry)
{
break;
}
// Try to start the connection again if it failed.
connStarted = false;
}
}
System.out.println("Connect attempt to " + address.toString() + " failed, ran out of time/attempts");
return false;
}
/* (non-Javadoc)
* @see java.io.Closeable#close()
*/
public void close()
{
try
{
channel.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
我有以下代码,旨在用于等待/检查服务器是否启动并监听给定的地址/端口。
这个想法是,例如,我可以调用
new CheckServerStarted(addr).check(60, true);
尝试连接到它长达 60 秒(如果连接失败,则重试,因为服务器尚未绑定套接字)
或者
new CheckServerStarted(addr).check(1, false);
检查服务器当前是否正在接受连接。
当我现在运行第一个示例时,我得到如下输出
Connect attempt failed : Connection refused: no further information
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt failed : null
14-Jun-2018 10:55:42 Connect attempt to /192.168.223.68:59695 failed, ran out of time/attempts
两次尝试之间显然没有等待 1 秒。
我猜我需要在尝试之间“重置”频道?我需要每次都创建一个新的吗?
解决方案
即使连接尝试失败,您也无法重新连接已连接的套接字。必须关闭它并创建一个新的。
其他问题:
- 您正在泄漏套接字。
- 摆脱睡眠并使用
Selector
. - 打印
e
而不是e.getMessage()
. 如果您一开始就正确地做到了这一点,而不是整天盯着“null”,您可能会自己解决问题。 - 调用是致命的
IOException
,finishConnect()
而不是重试的信号。
推荐阅读
- sql-server - SQL Server 断开连接
- javascript - 发送抛出 Ajax 后对象/数组丢失数据
- fastapi - 如何解决fastapi中没有属性“路由”?
- javascript - 如何从字符串中删除后跟动态字符串的aa子字符串?
- elasticsearch - 在elasticsearch中获取第N页数据以进行复合聚合的正确方法是什么?
- google-bigquery - 如何编写查询以删除除按 ID 分组的最大值之外的所有内容?
- reactjs - Typescript 在 reducer 中访问有效负载时抛出错误
- javascript - 如何在javascript中反转字符串
- python-3.x - 在字符串中用 ('') 替换 (') 但不是开始和结束的
- python - Swift序列化使用Python生成的稀疏矩阵