IO操作的小作业 利用NIO的非阻塞式IO的方式实现多个人连接服务端,且每一个客户端每间隔10s访问一次服务端,如果访问成功

作业:利用NIO的非阻塞式IO的方式实现多个人连接服务端,且每一个客户端每间隔10s访问一次服务端,如果访问成功

package com.rj.bd.zuoye03.zuoye03;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Scanner;

/**
*

  • @desc 14.利用NIO的非阻塞式IO的方式实现多个人连接服务端,且每一个客户端每间隔10s访问一次服务端

  • @author psh

  • @time 2018-11-7
    */
    public class NIONotBlockingClient {
    public static void main(String[] args) throws Exception {
    //1.获取通道
    SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(“10.2.32.6”,8888));

     //2.切换成非阻塞模式
     socketChannel.configureBlocking(false);
     
     //3.开辟指定大小的缓冲区
     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
     
     //4.发送数据
     //Scanner cin = new Scanner(System.in);
     while (true) 
     {
     	//System.out.println("客户端01请输入:");
     	//String inputStr = cin.next();
     	byteBuffer.put(("10秒老爹我出来一次").getBytes());
     	byteBuffer.flip();
     	socketChannel.write(byteBuffer);
     	byteBuffer.clear();
     	Thread.sleep(10000);
     }
    

    }

}

package com.rj.bd.zuoye03.zuoye03;

import java.net.InetSocketAddress;
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;

/**
*

  • @desc 14.利用NIO的非阻塞式IO的方式实现多个人连接服务端,且每一个客户端每间隔10s访问一次服务端

  • @author psh

  • @time 2018-11-7
    */
    public class NIONotBlockingServer {
    public static void main(String[] args) throws Exception {
    //1.获取通道
    System.out.println(“服务端启动。。。。。”);
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    //2.切换成非阻塞模式
    serverSocketChannel.configureBlocking(false);
    //3.绑定连接
    serverSocketChannel.bind(new InetSocketAddress(8888));
    //4.获取选择器
    Selector selector = Selector.open();
    //5.将通道注册到选择器上(第二个选项参数叫做选择键,可以用于告诉选择器需要监控这个通道的什么状态或者说做什么事情(读、写、连接、接受))
    //选择键是正兴致,如果需要监控钙通道的多个状态或事情,可以将多个选择键用位运算符“或”“|”来连接
    //这里服务器首先要监听客户端的接受状态
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    //6、轮询式地获取选择器上已经“准备就绪”的事情
    while (selector.select()>0)
    {
    //获取当前选择器中所有注册的“选择键(已就绪的监听事件)”
    Iterator iterator = selector.selectedKeys().iterator();

     	while (iterator.hasNext()) 
     	{
     		//获取“准备”就绪的是事件
     		SelectionKey selectionKey = iterator.next();
     		//判断是什么事件准备就绪
     		if (selectionKey.isAcceptable()) 
     		{
     			//10.若接受就绪,获取客户端连接
     			SocketChannel socketChanner = serverSocketChannel.accept();
     			System.out.println(socketChanner.getRemoteAddress()+":连接成功了");
     			//11.客户端连接socketChannel也需要切换非阻塞模式
     			socketChanner.configureBlocking(false);
     			//12.将改动到注册到选择器上,监控客户端sockdetChannel的读就绪事件
     			socketChanner.register(selector, SelectionKey.OP_READ);
     		}
     		else if (selectionKey.isReadable()) 
     		{
     			//13.获取当前选择器上“读就绪”状态的通道
     			SocketChannel socketChanner = (SocketChannel) selectionKey.channel();
     			//14.设定一个缓冲区
     			ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
     			//15.取出数据
     			int len = 0;
     			while ((len=socketChanner.read(byteBuffer))>0) 
     			{
     				byteBuffer.flip();
     				System.out.println(new String(byteBuffer.array(),0,len));
     				byteBuffer.clear();
     			}
     		}
     		iterator.remove();
     	}
     }
    

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值