java nio 示例代码

1.服务端

package io.netty.example.nio;

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

public class NioService {

	private static Selector selector;
	private static ByteBuffer readBuffer=ByteBuffer.allocate(1024);
	private static ByteBuffer writeBuffer=ByteBuffer.allocate(1024);

	public static void main(String[] args) {
		initAndRegist();
		resultEvent();
	}

	private static void initAndRegist(){
		try {
			selector=Selector.open();

			ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
			serverSocketChannel.configureBlocking(false);
			serverSocketChannel.bind(new InetSocketAddress(8080));
			serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

			System.out.println("服务端启动");

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void resultEvent(){
		while (true){
			try {
				selector.select();
				Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
				while (keys.hasNext()){
					SelectionKey key = keys.next();
					keys.remove();
					if(key.isValid()){
						try {
							if (key.isAcceptable()){
								accept(key);
							}
						}catch (CancelledKeyException e){
							key.cancel();
						}
						try{
							if(key.isReadable()){
								read(key);
							}
						}catch (CancelledKeyException cke){
							key.cancel();
						}
						try{
							if(key.isWritable()){
								write(key);
							}
						}catch (CancelledKeyException cke){
							key.cancel();
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	private static void write(SelectionKey key){
		writeBuffer.clear();
		SocketChannel channel = (SocketChannel)key.channel();
		Scanner reader = new Scanner(System.in);
		try {
			System.out.println("输入信息:");
			String line = reader.nextLine();
			writeBuffer.put(line.getBytes("UTF-8"));
			writeBuffer.flip();
			channel.write(writeBuffer);
			channel.register(selector,SelectionKey.OP_READ);
		}catch (IOException e){
			e.printStackTrace();
		}
	}

	private static void read(SelectionKey key){
		try {
			readBuffer.clear();
			SocketChannel channel = (SocketChannel)key.channel();
			int readLength = channel.read(readBuffer);
			if(readLength == -1){
				key.channel().close();
				key.cancel();
				return;
			}
			readBuffer.flip();
			byte[] datas = new byte[readBuffer.remaining()];
			readBuffer.get(datas);
			System.out.println("收到 " + channel.getRemoteAddress() + " 信息 : " + new String(datas,"UTF-8"));
			channel.register(selector,SelectionKey.OP_WRITE);
		}catch (IOException e){
			e.printStackTrace();
		}
	}

	private static void accept(SelectionKey key){
		try {
			ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
			SocketChannel channel = serverSocketChannel.accept();
			channel.configureBlocking(false);
			channel.register(selector,SelectionKey.OP_READ);
		}catch (IOException e){
			e.printStackTrace();
		}
	}
}

2.客户端

package io.netty.example.nio;


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

public class NioClient {
	public static void main(String[] args) {
		InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);
		SocketChannel socketChannel = null;
		ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
		ByteBuffer readBuffer = ByteBuffer.allocate(1024);

		try {
			Selector selector = Selector.open();

			socketChannel = SocketChannel.open(address);
			socketChannel.configureBlocking(false);
			socketChannel.register(selector,SelectionKey.OP_WRITE);

			while (true) {
				try {
					selector.select();
					Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
					while (keys.hasNext()) {
						SelectionKey key = keys.next();
						keys.remove();
						if (key.isValid()) {
							try {
								if (key.isWritable()) {
									writeBuffer.clear();
									Scanner reader = new Scanner(System.in);
									try {
										System.out.println("输入信息:");
										String line = reader.nextLine();
										writeBuffer.put(line.getBytes("UTF-8"));
										writeBuffer.flip();
										socketChannel.write(writeBuffer);
										socketChannel.register(selector, SelectionKey.OP_READ);
									} catch (IOException e) {
										e.printStackTrace();
									}
								}
							} catch (CancelledKeyException cke) {
								key.cancel();
							}
							try {
								if (key.isReadable()) {
									try {
										readBuffer.clear();
										int readLength = socketChannel.read(readBuffer);
										if (readLength == -1) {
											key.channel().close();
											key.cancel();
											return;
										}
										readBuffer.flip();
										byte[] datas = new byte[readBuffer.remaining()];
										readBuffer.get(datas);
										System.out.println("收到信息 : " + new String(datas, "UTF-8"));
										socketChannel.register(selector, SelectionKey.OP_WRITE);
									} catch (IOException e) {
										e.printStackTrace();
									}
								}
							} catch (CancelledKeyException cke) {
								key.cancel();
							}
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值