欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java NIO套接字编程

程序员文章站 2024-01-31 16:05:46
...

java NIO套接字编程

      在java的套接字编程中,大部分一般使用阻塞IO套接字编程。套接字的读取和写入会阻塞(也就是说不管现在有没有写入/读出数据 调用read和write方法将会阻塞)。而NIO将I/O事件注册,当特定的注册I/O事件到达时会通知您。不需要轮询,也不需要创建大量的线程下面一个例子:

package simple.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by banxia on 16/10/12.
 */
public class UseNioSocket {


    public static void main(String[] args) throws IOException {

        // 创建一个selector 对象
        Selector selector = Selector.open();

        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        ssc.socket().bind(new InetSocketAddress(8888));
        ssc.register(selector, SelectionKey.OP_ACCEPT);
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        System.out.println("服务已经启动端口:" + 8888);

        while (true) {

            int selectNum = selector.select();
            System.out.println("selectNum=" + selectNum);

            if (selectNum <= 0) {
                continue;
            }
            // 获取

            Iterator<SelectionKey> it = selector.selectedKeys().iterator();

            while (it.hasNext()) {

                SelectionKey key = it.next();

                if (key.readyOps() == SelectionKey.OP_ACCEPT) {
                    // 接收 accept

                    ServerSocketChannel channel = (ServerSocketChannel) key.channel();
                    SocketChannel accept = channel.accept();
                    accept.configureBlocking(false);
                    System.out.println("接收客户端:" + accept.socket().getInetAddress().getHostAddress() + ":" +  accept.socket().getPort());
                    accept.register(selector, SelectionKey.OP_READ);
                    it.remove();


                } else {

                    SocketChannel sc = (SocketChannel) key.channel();
                    System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"开始处理...");
                    while (true) {
                        buffer.clear();
                        long l = sc.read(buffer);
                        if (l <= 0) {
                            break;
                        }
                        System.out.print(".");
                        buffer.flip();
                        sc.write(buffer);


                    }
                    System.out.print("\n");
                    it.remove();
                    System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"处理完成处理...");

                }

            }


        }


    }
}