加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java IO学习笔记五:BIO到NIO

发布时间:2023-04-17 12:23:03 所属栏目:教程 来源:
导读:准备一个CentOS7的Linux实例, 实例的IP192.168.205.138

我们这次实验的目的就是直观感受一下Socket编程中BIO模型和NIO模型的性能差异

BIO
准备服务端代码:

import java.io.*;
import java.net.InetSocke
准备一个CentOS7的Linux实例, 实例的IP192.168.205.138

我们这次实验的目的就是直观感受一下Socket编程中BIO模型和NIO模型的性能差异

BIO
准备服务端代码:

import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.socket;
/**
 * BIO Socket Server
 */
public class SocketServerBIOTest {
    private static final int PORT = 9090;
    private static final int BACK_LOG = 2;
    public static void main(String[] args) {
        ServerSocket server = null;
        try {
            server = new ServerSocket();
            server.bind(new InetSocketAddress(PORT), BACK_LOG);
            System.out.println("server started , port : " + PORT);
        } catch (IOException e) {
            e.printstacktrace();
        }
        try {
            // 接受客户端连接
            while (true) {
                // 先阻塞,这样客户端暂时无法连接进来
//                system.in.read();
                // 这个方法也是阻塞的,如果没有客户端连接进来,会一直阻塞在这里,除非设置了超时时间
                Socket client = server.accept();
                System.out.println("client " + client.getPort() + " connected!!!");
                // 客户端连接进来后,开辟一个新的线程去接收并处理
                new Thread(() -> {
                    try {
                        InputStream inputStream = client.getInputStream();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                        char[] data = new char[1024];
                        while (true) {
                            int num = reader.read(data);
                            if (num > 0) {
                                System.out.println("client read some data is :" + num + " val :" + new String(data, 0, num));
                            } else if (num == 0) {
                                System.out.println("client read nothing!");
                                continue;
                            } else {
                                System.out.println("client read -1...");
                                system.in.read();
                                client.close();
                                break;
                            }
                        }
                    } catch (Exception e) {
                        e.printstacktrace();
                    }
                }).start();
            }
        } catch (Exception e) {
            e.printstacktrace();
        } finally {
            try {
                server.close();
            } catch (IOException e) {
                e.printstacktrace();
            }
        }
    }
}
并且在Linux实例上运行这个代码,然后在自己本地的机器上准备客户端的代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.socketChannel;
import java.util.LinkedList;
public class C10Kclient {
    public static void main(String[] args) {
        LinkedList<SocketChannel> clients = new LinkedList<>();
        InetSocketAddress serverAddr = new InetSocketAddress("192.168.205.138", 9090);
        for (int i = 10000,j = 10001; i < 65000; i+=2,j+=2) {
            try {
                SocketChannel client1 = SocketChannel.open();
                SocketChannel client2 = SocketChannel.open();
                client1.bind(new InetSocketAddress("192.168.205.1", i )); 
                client1.connect(serverAddr);
                clients.add(client1);
                client2.bind(new InetSocketAddress("192.168.205.1", j));
                client2.connect(serverAddr);
                clients.add(client2);
            } catch (IOException e) {
                e.printstacktrace();
            }
        }
        System.out.println("clients "+ clients.size());
        try {
            system.in.read();
        } catch (IOException e) {
            e.printstacktrace();
        }
    }
}
服务端每次用两端口循环多次去和服务端建立连

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章