Java 连接被拒绝后套接字关闭-这是正常行为吗?
我正在玩android socket接口,我从文档中了解到 .isConnected()和isClosed()方法没有说明套接字状态,但是 但是,如果我们在插座上调用了connect和close,这些指示就会消失 在我的应用程序中,我在两次尝试之间延迟10秒实施重试, 我看到了一件奇怪的事情,如果我从服务器获得连接被拒绝,我的下一次尝试是 失败,因为套接字已关闭 真的是这样吗 以下是我的连接功能:Java 连接被拒绝后套接字关闭-这是正常行为吗?,java,android,sockets,connection,Java,Android,Sockets,Connection,我正在玩android socket接口,我从文档中了解到 .isConnected()和isClosed()方法没有说明套接字状态,但是 但是,如果我们在插座上调用了connect和close,这些指示就会消失 在我的应用程序中,我在两次尝试之间延迟10秒实施重试, 我看到了一件奇怪的事情,如果我从服务器获得连接被拒绝,我的下一次尝试是 失败,因为套接字已关闭 真的是这样吗 以下是我的连接功能: private boolean ConnectToServer() { int
private boolean ConnectToServer() {
int retry = 0;
try {
ServerIP = InetAddress.getByName(mServer);
} catch (UnknownHostException e) {
e.printStackTrace();
}
SocketAddress mSocketAddress = new InetSocketAddress(ServerIP, mPort);
while ((!mSocket.isConnected()) && retry < 10) {
mLogger.setMessage("Status isConnected:"+mSocket.isConnected()+"Status isClosed:"+mSocket.isClosed());
mLogger.sendLog();
try {
mSocket.connect(mSocketAddress, 3000);
} catch (IOException e) {
e.printStackTrace();
}
retry++;
mLogger.setMessage("Attempting to connect to server - Sleeping for 5 Seconds Rety="+retry);
mLogger.sendLog();
SystemClock.sleep(5000);
}
mLogger.setMessage("Returning from attempting connection with socket status "+mSocket.isConnected());
return mSocket.isConnected();
}
正如您从日志中看到的,当我调用之前的connect to isClosed方法时,它返回false,但就在我尝试连接之后,我得到的异常是socket closed
我唯一一次没有关闭套接字是在第一次尝试时,这让我明白操作系统正在关闭套接字。。。然而,在这种情况下,我如何尝试重试,以及如何知道操作系统是否因为其他原因关闭了套接字
我看到一件奇怪的事。如果服务器拒绝连接,我的下一次尝试将失败,因为套接字已关闭
真的是这样吗
对。连接失败将关闭套接字
,您将无法再次使用它
这让我明白操作系统正在关闭套接字
实际上,在某些情况下,关闭是由Java发起的。(这并不重要。)
在这种情况下,我如何尝试重试
您需要放弃Socket
对象,创建另一个对象并与之连接。基本重试逻辑如下所示:
SocketAddress address = new InetSocketAddress(...);
while (retry <= NOS_RETRIES) {
Socket = new Socket();
try {
socket.connect(address, port);
return socket;
} catch (IOException e) {
// possibly log exception
if (/* it makes no sense to retry */) {
// rethrow e, or return null
}
retry++;
// delay
}
// rethrow last e, or return null
SocketAddress address=新的InetSocketAddress(…);
虽然(重试是的,这是正常的行为。不,你不能重用套接字。为什么你在成功后还要打印重试消息?打印“重试我的错误”,但不会真正影响流程…Kayaman-有没有关于如何实现重试的建议?我应该关闭线程并从活动中启动新线程并在那里处理它?还是应该生成新线程从当前线程执行线程并关闭原始线程?我唯一不明白的是.isclosed方法返回false的原因…但我想这就是它的原因…解释为什么会发生这种情况有点困难(很复杂)。但无论如何,您不应该在重试代码中使用isclosed
。
SocketAddress address = new InetSocketAddress(...);
while (retry <= NOS_RETRIES) {
Socket = new Socket();
try {
socket.connect(address, port);
return socket;
} catch (IOException e) {
// possibly log exception
if (/* it makes no sense to retry */) {
// rethrow e, or return null
}
retry++;
// delay
}
// rethrow last e, or return null