Java NIO通信简单实例

此例子使用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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值