package org.kne.cloud.network; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import org.kne.cloud.network.klalb.ByteBufferPool; public class PacketSpliter { private int splitSize; private static final ByteBufferPool bbfp=new ByteBufferPool(100,65535,false); private AtomicInteger series=new AtomicInteger(); public PacketSpliter(int splitSize) { this.splitSize=splitSize; } public int getSplitSize() { return splitSize; } @Override public String toString() { return "PacketSpliter [splitSize=" + splitSize + "]"; } public void write(ByteBuffer bb,WritableByteChannel wc) throws IOException{ ByteBuffer[]bbssp= split(bb); for (int i = 0; i < bbssp.length; i++) { wc.write(bbssp[i]); bbfp.back(bbssp[i]); } } public ByteBuffer[] split(ByteBuffer bb) { //System.out.print("Split:"); int lenth=bb.limit(); int countofpiece=(lenth-1)/splitSize+1; int remain=lenth%splitSize; ByteBuffer[]pieces=new ByteBuffer[countofpiece]; for (int i = 0; i < pieces.length; i++) { pieces[i]=bbfp.borrow(); } int sern=series.getAndIncrement(); for (int i = 0; i < pieces.length; i++) { pieces[i].putInt(sern); pieces[i].put((byte) countofpiece); pieces[i].put((byte) i); int bbl=bb.limit(); bb.limit(Math.min(bb.remaining(), pieces[i].remaining())+bb.position()); pieces[i].put(bb); bb.limit(bbl); //System.out.print(pieces[i].position()+" "); pieces[i].flip(); } //System.out.println(); return pieces; } }