java nio demo

本文介绍了一个简单的服务器端和客户端通信的实现方式,包括服务器监听、接受连接、读取客户端消息和向客户端发送消息的过程。

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

server 

 

public class Receive {
	public static void main(String[] args) throws Exception {
		CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();   
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		ServerSocketChannel ss = ServerSocketChannel.open();
		ss.socket().bind(new InetSocketAddress(8888));
		ss.configureBlocking(false);
		Selector se = Selector.open();
		ss.register(se, SelectionKey.OP_ACCEPT);
		while (se.select() > 0) {
			Set<SelectionKey> set = se.selectedKeys();
			for (SelectionKey key : set) {
				if (key.isAcceptable()) {
					 ServerSocketChannel server = (ServerSocketChannel) key.channel();   
		             SocketChannel channel = server.accept();   
		             channel.configureBlocking(false);   
		             channel.register(se, SelectionKey.OP_READ);   
				} else if (key.isReadable()) {
					SocketChannel sc = (SocketChannel) key.channel();
					sc.read(buffer);
					buffer.flip();
					System.out.println("[server]" + new String(buffer.array(), 0, buffer.limit()));
					sc.register(se, SelectionKey.OP_WRITE);
				} else if (key.isWritable()) {
					SocketChannel sc = (SocketChannel) key.channel();
					sc.write(encoder.encode(CharBuffer.wrap("send to client.")));
					sc.register(se, SelectionKey.OP_READ);
				}
			}
			set.clear();
		}
	}
}

 

 

client

 

public class Send {
	
	private String ENCODING_UTF8 = "utf-8";
	private ByteBuffer buffer = ByteBuffer.allocate(1024);
	private CharsetEncoder encoder = Charset.forName(ENCODING_UTF8).newEncoder();
	private String server = "localhost";
	private Integer port = 8888;
	private SocketChannel channel;
	private Selector selector;

	private void init() throws IOException, ClosedChannelException {
		selector = Selector.open();
		channel = SocketChannel.open();
		channel.configureBlocking(false);
		channel.register(selector, SelectionKey.OP_CONNECT
				| SelectionKey.OP_WRITE | SelectionKey.OP_READ);
	}

	public void connect() throws IOException {
		channel.connect(new InetSocketAddress(server, port));
		while (selector.select() > 0) {
			Set<SelectionKey> readyKeys = selector.selectedKeys();
			Iterator<SelectionKey> it = readyKeys.iterator();
			while (it.hasNext()) {
				SelectionKey key = it.next();
				if (key.isConnectable()) {
					if (channel.isConnectionPending()) {
						channel.finishConnect();
					}
					onSend(key);
				} else if (key.isReadable()) {
					onReceive(key);
				} else if (key.isWritable()) {
					onSend(key);
				}
				it.remove();
			}
		}
	}

	private void onReceive(SelectionKey key) throws IOException {
		SocketChannel sc = (SocketChannel) key.channel();
		sc.read(buffer);
		buffer.flip();
		System.out.println("[client]"
				+ new String(buffer.array(), 0, buffer.limit()));
	}

	private void onSend(SelectionKey key) throws IOException {
		SocketChannel sc = (SocketChannel) key.channel();
		sc.write(encoder.encode(CharBuffer.wrap("send to server.")));
	}

	public static void main(String[] args) throws Exception {
		Send del = new Send();

		del.init();

		del.connect();
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值