Java NIO通信简单实例

本文介绍了一个使用NIO的SocketChannel和服务端ServerSocketChannel的简单示例,该示例实现了服务端向客户端发送字符串的功能。客户端通过Selector监听来自服务端的数据,服务端则在接收到客户端连接请求后向其发送预设的字符串。
此例子使用socketchannel和serversocketchannel,把服务端的一个字符串传递到客户端,并且在客户端输出

客户端:

public class Client01 {
	SocketChannel client;
	Selector selector;
	ByteBuffer buffer;
	public Client01() throws IOException {
			client = SocketChannel.open(new InetSocketAddress("127.0.0.1",9800));
			selector = Selector.open();
			client.configureBlocking(false);
			client.register(selector,SelectionKey.OP_READ);
			buffer = ByteBuffer.allocate(5555);
			connect();
	}
	/*
	 * 连接服务端,并且把传递过来的数据读取到缓冲区
	 */
	public void connect() throws IOException {
		while (true) {
				if (selector.select()>0) {
					Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();
				while (ikeys.hasNext()) {
					SelectionKey selectionKey = ikeys.next();
					if (selectionKey.isReadable()) {
						reads();
					}
					ikeys.remove();
				}
			}
			
		}
		
	}
	public void reads() throws IOException {
		buffer.clear();
		client.read(buffer);
		buffer.flip();
		System.out.println(new String(buffer.array() ,  
                0 , buffer.limit() , "UTF-8"));
	}
	public static void main(String[] args) throws IOException {
			Client01 client01 = new Client01();
	}
}

服务端:

public class Server01 {
	ServerSocketChannel server;
	Selector selector;
	ByteBuffer buffer;
	/*
	 * 构造函数,初始化各个变量,对ServerSocketChannel进行注册
	 */
	public Server01() throws IOException {
			selector = Selector.open();
			server = ServerSocketChannel.open();
			server.configureBlocking(false);//设置为非阻塞模式
			server.socket().bind(new InetSocketAddress(9800));
			server.register(selector, SelectionKey.OP_ACCEPT);
			buffer = ByteBuffer.allocate(25550);
			openserver();
	}
	/*
	 * 此方法把一个字符串传递给客户端
	 */
	public void openserver() throws IOException {
		System.out.println("服务器开启");
		while (true) {
			
			if (selector.select()>0) {
				Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();
				while (ikeys.hasNext()) {
					SelectionKey selectionKey = ikeys.next();
					if (selectionKey.isAcceptable()) {
						ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
						SocketChannel socketChannel = serverSocketChannel.accept();
						send(socketChannel, "7758258");
						
					}
					ikeys.remove();
				}
			}
		}
	}
	/*
	 * 传递数据到客户端函数
	 */
	public void send(SocketChannel socketChannel,String string) throws IOException {
		buffer.clear();//清除缓冲区,在使用一系列通道读取或放置 操作填充此缓冲区之前调用此方法
		buffer.put(string.getBytes());
		buffer.flip();//反转此缓冲区,在一系列通道读取或放置 操作之后,调用此方法为一系列通道写入或相对获取 操作做好准备
		socketChannel.write(buffer);
		
	}
	public static void main(String[] args) throws IOException {
		Server01 server01 = new Server01();
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值