NIO 入门 实例

本文介绍了一个使用Java NIO实现的简单服务器和客户端程序。服务器监听8888端口,接收客户端消息并回复;客户端连接服务器并发送消息,接收服务器响应。程序展示了如何配置非阻塞通道、注册选择器及处理不同类型的SelectionKey。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NIOServer


package com.nio.test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
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 NIOServer implements Runnable{

	private	ServerSocketChannel serverSocketChannel;
	private	ServerSocket serverSocket;
	private	Selector selector;
	/*标识数字*/  
    private  int flag = 0;  
    /*缓冲区大小*/  
    private  int BLOCK = 4096;  
    /*接受数据缓冲区*/  
    private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);  
    /*发送数据缓冲区*/  
    private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK); 
	
	
	public NIOServer(int port) {
	 
	 try {
		 //打开服务器管道
		 serverSocketChannel = ServerSocketChannel.open();
		 // 服务器配置为非阻塞 
		 serverSocketChannel.configureBlocking(false);
		 //检索与此通道关联的服务器套接字 
		 serverSocket=serverSocketChannel.socket();
		 //进行服务的绑定
		 serverSocket.bind(new InetSocketAddress(port));
		 //通过open获取selector
		 selector=Selector.open();
		// 注册到selector,等待连接 
		 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
		 System.out.println("bind 8888 port.........");
		 
	 } catch (IOException e) {
		e.printStackTrace();
	}
	
	}

	
	public void run() {
		
		while (true) {
			// 选择一组键,并且相应的通道已经打开  
			try {
				selector.select();
				Set<SelectionKey> selectionKeys = selector.selectedKeys();
				Iterator<SelectionKey>	iterator = selectionKeys.iterator();
				while (iterator.hasNext()) {
					SelectionKey selectionKey = (SelectionKey) iterator.next();
					iterator.remove();
					if (flag == 10) {
						System.exit(0);
					}
					handler(selectionKey);
				}
			} catch (Exception e) {
				System.exit(0);
			}		
		}
	}
	private void handler(SelectionKey selectionKey) throws Exception {
		 // 接受请求  
        ServerSocketChannel server = null;  
        SocketChannel client = null;  
        String receiveText;  
        String sendText;  
        int count=0;  
		if (selectionKey.isAcceptable()) {
			server =(ServerSocketChannel) selectionKey.channel();
		    client = server.accept();
		    client.configureBlocking(false);
		    client.register(selector, SelectionKey.OP_READ);
		}else if (selectionKey.isReadable()) {
			client =(SocketChannel) selectionKey.channel();
			receivebuffer.clear();
			count =	client.read(receivebuffer);
			if (count > 0) {
				receiveText = new String(receivebuffer.array(),0,count);  
                System.out.println("服务器端接受客户端数据--:"+receiveText);  
                client.register(selector, SelectionKey.OP_WRITE);  
			}
		}
		else if (selectionKey.isWritable()) {
			sendbuffer.clear();
			client=(SocketChannel) selectionKey.channel();
			sendText="message form server ---"+flag++;
			sendbuffer.put(sendText.getBytes());
			sendbuffer.flip();
			//
			client.write(sendbuffer);
			System.out.println("服务器端向客户端发送数据---:"+sendText);
			client.register(selector, SelectionKey.OP_READ);
		}else if (selectionKey.isConnectable()) {
			System.out.println("selectionKey is Connectable .");
		}
		
	}


	public static void main(String[] args) {
		int port = 8888;
		NIOServer nioServer = new NIOServer(port);
		new Thread(nioServer).start();
	}
}

NIOClient



package com.nio.test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NIOClient implements Runnable{

	private	SocketChannel serverSocket;
	private	Selector selector;
	/*标识数字*/  
    private  int flag = 0;  
    /*缓冲区大小*/  
    private  int BLOCK = 4096;  
    /*接受数据缓冲区*/  
    private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);  
    /*发送数据缓冲区*/  
    private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK); 
	
	
	public NIOClient(int port) {
	 
	 try {
		 serverSocket = SocketChannel.open();
		 // 配置为非阻塞 
		 serverSocket.configureBlocking(false);
		 //进行连接
		 serverSocket.connect(new InetSocketAddress(port));
		 //通过open获取selector
		 selector=Selector.open();
		// 注册到selector,等待连接 
		 serverSocket.register(selector, SelectionKey.OP_CONNECT);
		 System.out.println("connet 8888 port.........");
		 
	 } catch (IOException e) {
		e.printStackTrace();
	}
	
	}

	
	public void run() {
		
		while (true) {
			// 选择一组键,并且相应的通道已经打开  
			try {
				selector.select();
				Set<SelectionKey> selectionKeys = selector.selectedKeys();
				Iterator<SelectionKey>	iterator = selectionKeys.iterator();
				while (iterator.hasNext()) {
					SelectionKey selectionKey = (SelectionKey) iterator.next();
					iterator.remove();
					if (flag == 10) {
						System.exit(0);
					}
					handler(selectionKey);
				}
			} catch (Exception e) {
				e.printStackTrace();
				System.exit(0);
			}		
		}
	}
	private void handler(SelectionKey selectionKey) throws Exception {
        SocketChannel client = null;  
        String receiveText;  
        String sendText;  
        int count=0;  
		if (selectionKey.isConnectable()) {
			System.out.println("client connect"); 
            client = (SocketChannel) selectionKey.channel(); 
            // 判断此通道上是否正在进行连接操作。 
            // 完成套接字通道的连接过程。 
            if (client.isConnectionPending()) { 
                client.finishConnect(); 
                System.out.println("完成连接!"); 
                sendbuffer.clear(); 
                sendbuffer.put("Hello,Server".getBytes()); 
                sendbuffer.flip(); 
                client.write(sendbuffer); 
            } 
            client.register(selector, SelectionKey.OP_READ); 
		}else if (selectionKey.isReadable()) {
			client =(SocketChannel) selectionKey.channel();
			receivebuffer.clear();
			count =	client.read(receivebuffer);
			if (count > 0) {
				receiveText = new String(receivebuffer.array(),0,count);  
                System.out.println("客户端接受服务器端数据--:"+receiveText);  
                client.register(selector, SelectionKey.OP_WRITE);  
			}
		}
		else if (selectionKey.isWritable()) {
			sendbuffer.clear();
			client=(SocketChannel) selectionKey.channel();
			sendText="message form client ---"+flag++;
			sendbuffer.put(sendText.getBytes());
			sendbuffer.flip();
			//
			client.write(sendbuffer);
			System.out.println("客户端向服务器端发送数据---:"+sendText);
			client.register(selector, SelectionKey.OP_READ);
		}else if (selectionKey.isConnectable()) {
			System.out.println("selectionKey is Connectable .");
		}
		
	}


	public static void main(String[] args) {
		int port = 8888;
		NIOClient nioServer = new NIOClient(port);
		new Thread(nioServer).start();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值