2. 网络编程

1. InetAddress

public class UseInet {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getByName("www.baidu.com");
        System.out.println(address);

        InetAddress address2 = InetAddress.getByName("124.232.170.22");
        System.out.println(address2.getHostName());

        InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
        for (InetAddress addr : allByName) {
            System.out.println(addr);
        }
    }
}

2. BIO

在这里插入图片描述

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress(10001));
        Socket socket = serverSocket.accept();
        try (ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
             ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream())) {

            String userName = inputStream.readUTF();
            System.out.println("Accept client message:" + userName);

            outputStream.writeUTF("Hello," + userName);
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
            serverSocket.close();
        }
    }
}

public class Client {
    public static void main(String[] args) throws IOException {
        InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 10001);

        Socket socket = null;
        ObjectOutputStream output = null;
        ObjectInputStream input = null;

        try {
            socket = new Socket();
            socket.connect(addr);

            output = new ObjectOutputStream(socket.getOutputStream());
            input = new ObjectInputStream(socket.getInputStream());

            output.writeUTF("Mark");
            output.flush();

            System.out.println(input.readUTF());
        } finally {
            if (socket != null) {
                socket.close();
            }
            if (output != null) {
                output.close();
            }
            if (input != null) {
                input.close();
            }
        }
    }
}

3. NIO

BIO 面向流,NIO 面向缓冲。
三大核心组件:Selector、Channel、Buffer
操作类型:SelectionKey

3.1 Buffer

重要属性:capacity、position、limit
在这里插入图片描述

在这里插入图片描述

public class AllocateBuffer {
    public static void main(String[] args) {
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();

        System.out.println("before allocate:" + osmxb.getFreePhysicalMemorySize());

        /*堆上分配*/
        ByteBuffer buffer = ByteBuffer.allocate(200000);
        System.out.println("buffer = " + buffer);
        System.out.println("after allocate:" + osmxb.getFreePhysicalMemorySize());

        /* 这部分用的直接内存*/
        ByteBuffer directBuffer = ByteBuffer.allocateDirect(200000);
        System.out.println("directBuffer = " + directBuffer);
        System.out.println("after direct allocate:" + osmxb.getFreePhysicalMemorySize());

        System.out.println("----------Test wrap--------");
        byte[] bytes = new byte[32];
        buffer = ByteBuffer.wrap(bytes);
        System.out.println(buffer);
    }
}

public class BufferMethod {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(32);
        buffer.put((byte) 'a')
                .put((byte) 'b')
                .put((byte) 'c')
                .put((byte) 'd')
                .put((byte) 'e')
                .put((byte) 'f');
        // 转换为读取模式
        buffer.flip();
        System.out.println((char) buffer.get());

        // 绝对读写
        ByteBuffer bb = ByteBuffer.allocate(32);
        bb.put(2, (byte) 'c');

        buffer.rewind();// 将position设回0
        buffer.clear();
        buffer.position(5);// 移动position到5
        buffer.mark();// 记录当前position的位置
        buffer.reset();// 复位position到记录的地址
        System.out.println("after reset:" + buffer);
    }
}

3.2 NIO

在这里插入图片描述

public class NioServer {
    public static void main(String[] args) {
        try {
            Selector selector = Selector.open();
            ServerSocketChannel serverChannel = ServerSocketChannel.open();
            //开启非阻塞模式
            serverChannel.configureBlocking(false);
            serverChannel.socket().bind(new InetSocketAddress(12345), 1024);
            //监听客户端连接请求
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);

            selector.select();
            Set<SelectionKey> keys = selector.selectedKeys();
            Iterator<SelectionKey> it = keys.iterator();
            SelectionKey key;
            while (it.hasNext()) {
                key = it.next();
                it.remove();
                try {
                    handleInput(key, selector);
                } catch (Exception e) {
                    if (key != null) {
                        key.cancel();
                        if (key.channel() != null) {
                            key.channel().close();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private static void handleInput(SelectionKey key, Selector selector) throws IOException {
        if (key.isValid()) {
            if (key.isAcceptable()) {
                ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
                SocketChannel sc = ssc.accept();
                sc.configureBlocking(false);
                sc.register(selector, SelectionKey.OP_READ);
            }
            if (key.isReadable()) {
                SocketChannel sc = (SocketChannel) key.channel();
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                int readBytes = sc.read(buffer);
                if (readBytes > 0) {
                    buffer.flip();
                    byte[] bytes = new byte[buffer.remaining()];
                    buffer.get(bytes);
                    String message = new String(bytes, "UTF-8");
                    System.out.println("服务器收到消息:" + message);
                    String result = response(message);
                    doWrite(sc, result, selector);
                } else if (readBytes < 0) {
                    key.cancel();
                    sc.close();
                }
            }
            if (key.isWritable()) {
                SocketChannel sc = (SocketChannel) key.channel();
                ByteBuffer buffer = (ByteBuffer) key.attachment();
                if (buffer.hasRemaining()) {
                    int count = sc.write(buffer);
                    System.out.println("write :" + count + "byte, remaining:" + buffer.hasRemaining());
                } else {
                    key.interestOps(SelectionKey.OP_READ);
                }
            }
        }
    }

    private static void doWrite(SocketChannel channel, String response, Selector selector)
            throws IOException {
        byte[] bytes = response.getBytes();
        ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
        writeBuffer.put(bytes);
        writeBuffer.flip();
        channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, writeBuffer);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值