BIOBIO服务端:接受客户端的数据 , 然后打印在控制台
BIO客户端:向服务端发送数据 。NIO的测试中也使用这个客户端进行测试
/** * BIO * @author xuxiaobai */public class BIOTest {private final static int port = 8080;public static void main(String[] args) throws IOException {TCPClient();//TCPServer();}/*** TCP客户端* 发送TCP* @throws IOException*/private static void TCPClient() throws IOException {SocketChannel socketChannel = SocketChannel.open();//定义地址InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);//连接socketChannel.connect(inetSocketAddress);System.out.println("连接成功:"+inetSocketAddress);Scanner scanner = new Scanner(System.in);while (true) {String next = scanner.next();//直接包装一个bufferByteBuffer wrap = ByteBuffer.wrap(next.getBytes());//写入socketChannel.write(wrap);if ("exit".equals(next)) {//等于exit时关闭channelsocketChannel.close();break;}}}/*** TCP服务端* 接受TCP* @throws IOException*/private static void TCPServer() throws IOException {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//定义地址InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);//绑定serverSocketChannel.bind(inetSocketAddress);System.out.println("绑定成功:"+inetSocketAddress);while (true) {//接受连接SocketChannel accept = serverSocketChannel.accept();new Thread(new Runnable() {@Overridepublic void run() {//定义一个缓冲区 , 读出来的数据超出缓冲区的大小时会被丢弃ByteBuffer byteBuffer = ByteBuffer.allocate(1024);while (true) {try {//每次使用前都要清空 , 但这里没有真的区clear数据 , 只是移动了buffer里面的下标byteBuffer.clear();//读取数据到缓冲区accept.read(byteBuffer);//每次读取数据前都要flip一下 , 这里都移动下标byteBuffer.flip();byte[] bytes = new byte[byteBuffer.remaining()];//获取数据byteBuffer.get(bytes);String x = new String(bytes);System.out.println(x);if (x.equals("exit")) {//当读出来的数据等于exit时退出accept.close();break;}} catch (Exception e) {e.printStackTrace();}}}}).start();//启动该线程}}}
搞完了代码 , 让我们来看看代码的演示效果————从客户端发送数据到服务端 , 下面展示一下效果:
先后启动BIO的TCPServer和TCPClient方法;
TCPClient:
文章插图
TCPServer:
文章插图
步骤
文章插图
画了个图来表示 , 这是关于selector的配置流程 , 在循环中根据不同key值所进行的操作 , 跟上面文件复制的例子差不多了 , 只不过这里的Channel是通过 key.channel()获得的 。
差别我们来看看一下BIO和NIO的差别 。
BIO我们用IDEA的debug启动BIO的服务端 , 然后在启动多个客户端 。
文章插图
我这里启动了三个客户端 , 可以看到有三个线程已经创建好了 , 然而我这时还没有发送数据到服务端 。
NIO我们用IDEA的debug启动NIO的服务端 , 然后在启动多个BIO客户端 。
文章插图
这里启动了多个客户端 , 服务器上没有多余的几个线程 。
修改BIO的TCPClient方法
private static void TCPClient() throws IOException {SocketChannel socketChannel = SocketChannel.open();//定义地址InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);//连接socketChannel.connect(inetSocketAddress);System.out.println("连接成功:" + inetSocketAddress);Scanner scanner = new Scanner(System.in);while (true) {String next = scanner.next();//直接包装一个buffer//ByteBuffer wrap = ByteBuffer.wrap(next.getBytes());//写入while (true) {try {//休眠//注意 , 休眠时间建议调高一点Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}socketChannel.write(ByteBuffer.wrap(next.getBytes()));}//if ("exit".equals(next)) {////等于exit时关闭channel//socketChannel.close();//break;//}}}复制代码
休眠时间记得调高点!!!宕机警告!这样客户端就会在读取到第一次时 , 一直发送这个数据 , 可以看到一些线程 , 也是只有在收到数据之后才会创建这个线程去打印这个数据 。如果休眠时间调高一点的话 , 就会看到有时候这里会一闪一闪的 , 调低后就会出现一闪而过的很多线程 , 如下图 。
推荐阅读
- 芦柑皮泡水喝有什么好处,金银花泡水喝有什么好处
- 什么药治痔疮最快断根,治痔疮用什么药最好
- 什么药护肝最好,养肝护肝喝什么茶最好这些茶喝了对肝好
- 雪山白露的功效与作用,白露为什么要喝白露茶
- 服务器为什么会被攻击?黑客发动网络攻击要花多少钱
- 乾隆最宠爱和孝还是和敬公主,乾隆的固伦公主都有谁
- 文鸳厉害嘛,文鸳和文鸯是一个人吗?
- 明英宗朱祁镇,朱祁镇下一位皇帝是谁
- 刘备登基后官职最大的是谁,刘备称帝后官职排名
- 李自成灭亡的真正原因,李自成失败的根本原因是什么