我用nio做了一个服务器端 在客户端关闭了socket后 服务器端报出异常 java.io.IOException: 您的主机中的软件放弃了一个已建立的连接。 while (socket.socket().isConnected())  这是我用的循环,为什么我关闭了客户端后这里依然判断是连接的。

解决方案 »

  1.   

    while ((i = acceptKey.selector().select()) > 0) 
    这里把客户端关闭后为什么select的直还是1啊。。
      

  2.   

    还需要加一个条件额while (socket.socket().isConnected()&&!socket.socket().isClosed)这样就好了第一个条件叫 曾经连接过  
    第二个条件 已经连到那个什么东西并且没有关闭 true; otherwise, false
      

  3.   

    推荐LZ一个nio的框架实现
    MINA
    它对一些较底层的操作都做了封装
    你可以把注意力都用在业务处理上了
    我也只是初涉
    网上资料挺多
    而且它对部分常用的协议也做了封装如http等
      

  4.   

    isConnectioned()是判断不了的,你可以在read()那的捕捉异常,抛出异常时就可以判断是超时还是断开;
    你也可以这样啊:
    while(status && socket != null){
    try{
    socket.sendUrgentData(0xFF);
    socket_sign = true ;
    ghp.setPpConnect(true);  //连接情况
    Thread.sleep(5000);
    }catch(Exception e1){
    System.out.println("Pumper Server Interruped...!");
    status = false;
    socket_sign = false;
    ghp.setPpConnect(false);
    }
      

  5.   

    我在把客户端关闭了以后 服务器这边调用socket。isclosed 还是false。
      

  6.   

    通过read()捕捉IOException,个人感觉不是很好,因为这是一个阻塞的方法,它放出IOException是因为 read()在某一次读取数据==-1,客户端离开
    并未发送数据,所以服务器端接收的数据长度只会一直是0,所以客户端离开并不是触发IOException的真正原因.个人建议在socket.getInputstream()或者是
    socket.getOutputStream()出捕捉IOException,这样客户端离开就会抛出真正的异常了.不过通过抛出异常中断程序实在不是一种非常好的办法,具体建议去读读<<编程匠艺>>,绝对有意想不到的提高.
      

  7.   


    可是我的异常就是在read处出现的啊,因为客户端连接被关闭的原因,这样的话socket.getInputstream()也会出现异常吗
      

  8.   

    socket.getInputStream()报的异常就是connect Exception,你在socket.getInputStream() try/catch,然后断开客户,就是上面的异常.