【问题标题】:Sockets in ArrayList wont get closed [duplicate]ArrayList 中的套接字不会关闭[重复]
【发布时间】: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 - 很好的答案,谢谢

标签: java sockets arraylist


【解决方案1】:

当我从客户端关闭套接字时,isConnected() 方法必须返回 false。

不,不应该。哪里说的?

实际情况是,如果您曾经连接过您拥有的 Socket,isConnected() 将返回 true。检测peer终止的正确方法如下:

  • read() 返回 -1
  • readLine() 返回null
  • readXXX() 为任何其他 XXX 抛出 EOFException
  • write() 抛出 IOException

【讨论】:

  • 谢谢伙计。他们应该将方法命名为 everconnected
  • '返回连接状态socket'已经足够清楚了,但我同意他们应该添加关于not of the connection的警告这和isClosed().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多