日期:2014-05-20  浏览次数:21014 次

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可以自己写一个异常啊,然后放在出现问题的地方处理一下啊
------解决方案--------------------