Files
KLALB/src/org/kne/cloud/network/PacketSpliter.java
T
2024-08-18 17:47:11 +08:00

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;
}
}