当前位置: 代码迷 >> J2SE >> JAVA NIO 怎么捕获Socket关闭事件
  详细解决方案

JAVA NIO 怎么捕获Socket关闭事件

热度:149   发布时间:2016-04-24 01:29:02.0
JAVA NIO 如何捕获Socket关闭事件
服务端代码:
Java code
import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ClosedChannelException;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Iterator;import java.util.Set;public class TCP {    ServerSocketChannel socketChannel;    Selector selector;    int port = 8778;    String[] opsName=new String[17];    ByteBuffer buffer;    int count = 0;    public TCP(){        opsName[SelectionKey.OP_ACCEPT]="OP_ACCEPT";        opsName[SelectionKey.OP_CONNECT]="OP_CONNECT";        opsName[SelectionKey.OP_READ]="OP_READ";        opsName[SelectionKey.OP_WRITE]="OP_WRITE";        buffer =ByteBuffer.allocate(10);        try {            socketChannel=ServerSocketChannel.open();            socketChannel.configureBlocking(false);            socketChannel.socket().setReuseAddress(true);            socketChannel.socket().bind(new InetSocketAddress(port));            selector=Selector.open();            System.out.println(socketChannel.hashCode());                    } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public void start(){        try {            socketChannel.register(selector, SelectionKey.OP_ACCEPT);        } catch (ClosedChannelException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }        System.out.println("server start port "+port);        while(true){                        int n;            try {                System.out.print("wait...");                n = selector.select(60000);                System.out.println(n);                if(n<=0)continue;                                Iterator<SelectionKey> it = selector.selectedKeys().iterator();                while(it.hasNext()){                    SelectionKey key = it.next();                    it.remove();                    System.out.println("key:"+opsName[key.interestOps()]+","+key.channel().hashCode());                    if(key.isReadable()){                        System.out.println(key.hashCode()+" isReadable");                        socketChannel.accept().register(selector, SelectionKey.OP_READ);                                        }                                        else if(key.isAcceptable()){                                                System.out.println(key.hashCode()+" accepted");                        SocketChannel client =socketChannel.accept();                        client.configureBlocking(false);                        //client.register(selector, SelectionKey.OP_WRITE);                        //SocketChannel client =(SocketChannel) key.channel();                        buffer.clear();                        buffer.putInt(count++);                        buffer.flip();                        client.write(buffer);                        System.out.println(client.hashCode()+" write..");                    }                    else if(key.isWritable()){                                            }                                    }                            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }                    }    }    public static void main(String[] args) {        TCP tcp = new TCP();        tcp.start();    }}

客户端连接进来后获取一个int就断开,在哪里可以捕获到断开事件?

------解决方案--------------------
LZ可以自己写一个异常啊,然后放在出现问题的地方处理一下啊
------解决方案--------------------
  相关解决方案