本文共 2433 字,大约阅读时间需要 8 分钟。
Server.java
package com.atguigu.nio.zerocopy;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;public class NewIOServer { public static void main(String[] args) throws Exception { InetSocketAddress address = new InetSocketAddress(7002); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); ServerSocket serverSocket = serverSocketChannel.socket(); serverSocket.bind(address); ByteBuffer byteBuffer = ByteBuffer.allocate(4096); while (true) { SocketChannel socketChannel = serverSocketChannel.accept(); int readCount = 0; while (-1 != readCount) { try { readCount = socketChannel.read(byteBuffer); } catch (Exception e) { break; } byteBuffer.rewind(); } } }}
Client.java
package com.atguigu.nio.zerocopy;import java.io.FileInputStream;import java.net.InetSocketAddress;import java.nio.channels.FileChannel;import java.nio.channels.SocketChannel;public class NewIOClient { public static void main(String[] args) throws Exception { SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("localhost", 7002)); String filename = "./test.avi"; FileChannel fileChannel = new FileInputStream(filename).getChannel(); long startTime = System.currentTimeMillis(); // 总共字节数 long totalSize = fileChannel.size(); // windows平台最大传送数据包 long max_pkg = 8 * 1024 * 1024; // 本次传输到的位置 long cur_pos = 0; long transSize = 0; // 如果剩余的字节数量 > 8M while (totalSize > max_pkg) { // 本次传输的字节数 long tmp = fileChannel.transferTo(cur_pos, max_pkg, socketChannel); // 传输后剩余字节数 totalSize -= tmp; // 传输到的位置 cur_pos += tmp; // 已经传输的大小 用于校验 transSize += tmp; } // 如果还有剩余,则将剩余一次性传输 if (totalSize > 0) { long tmp = fileChannel.transferTo(cur_pos, totalSize, socketChannel); transSize += tmp; } System.out.println("发送的总的字节数=" + transSize + " 耗时=" + (System.currentTimeMillis() - startTime)); fileChannel.close(); }}
转载地址:http://cqaa.baihongyu.com/