【发布时间】:2014-07-24 22:42:00
【问题描述】:
所以我有这个应用程序,我将套接字存储在服务器端的 ArrayList 中。当客户端关闭其应用程序时,套接字也必须关闭,但它不会反映服务器中 ArrayList 的更改。
class arrays
{
public static ArrayList<Socket> online_buyer=new ArrayList<Socket>();
public static ArrayList<Socket> online_seller=new ArrayList<Socket>();
public static ArrayList<String> buyer_prod=new ArrayList<String>();
}
public void seller_display()
{
while(true)
{
if(flag==1)
{
synchronized(sock)
{
for(int i=0;i<arrays.online_buyer.size();i++)
{
System.out.println(arrays.buyer_prod.get(i));
}
flag=0;
}
}
check2();
}
}
public void check2()
{
for(int i=0;i<arrays.online_buyer.size();i++)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
**while(!arrays.online_buyer.get(i).isConnected())**
{
arrays.online_buyer.remove(i);
arrays.buyer_user.remove(i);
arrays.buyer_add.remove(i);
arrays.buyer_prod.remove(i);
arrays.time.remove(i);
arrays.buyer_no.remove(i);
flag=1;
System.out.println("RECORD DELETED");
}
}
}
public void run()
{
get_details();
}
}
现在语句 while(!arrays.online_buyer.get(i).isConnected()) 必须是 while(!false)=true。当我从客户端关闭套接字时,isconnected() 方法必须返回 false。但是即使我从客户端关闭套接字,这个语句也永远不会是错误的。
【问题讨论】:
-
试过编译这段代码吗? :)
-
TCP 来救援!服务器无法检测到已关闭的连接,除非它尝试对其进行读取或写入。
-
您的问题能否归结为“为什么
socket.isConnected()在客户端关闭连接后仍返回true”? -
据我记得,您不会注意到
isConnected状态下的客户端关闭事件,而是通过输入流中的 EOF 信号。 -
@EJP - 很好的答案,谢谢