64 lines
1.6 KiB
Java
64 lines
1.6 KiB
Java
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;
|
|
}
|
|
|
|
}
|