KLALB V3.4

This commit is contained in:
Administrator
2025-11-15 11:08:16 +08:00
parent 306bfd36f7
commit 8842566ee2
160 changed files with 18540 additions and 4512 deletions
@@ -5,6 +5,7 @@ import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.StreamCorruptedException;
import java.net.InetSocketAddress;
import java.net.ProtocolFamily;
import java.net.Socket;
@@ -17,11 +18,17 @@ import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.Channels;
import java.nio.channels.GatheringByteChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.ScatteringByteChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.WritableByteChannel;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicLong;
import org.kne.cloud.network.BufferedChannel;
import org.kne.cloud.network.ByteBufferAllocator;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.NetworkPacket;
@@ -32,6 +39,7 @@ import org.kne.io.KNEChannels;
public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink {
private volatile long timeoutTimer;
private volatile boolean timerenabled=false;
private boolean enableBuffer=true;
private Runnable timeouter=new Runnable() {
public void run() {
timeoutTimer=System.nanoTime();
@@ -61,13 +69,34 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
}
private SocketChannel connectSocket;
private ScatteringByteChannel readableChannel;
private GatheringByteChannel writableChannel;
private int sotimeout=getDefaultSoTimeout();
public StreamChannelKLALBPacketLink(SocketChannel connectSocket) throws IOException {
this(connectSocket,true);
}
public StreamChannelKLALBPacketLink(SocketChannel connectSocket,boolean enableBuffer) throws IOException {
try {
this.connectSocket=connectSocket;
if(enableBuffer) {
BufferedChannel buf=new BufferedChannel(connectSocket,connectSocket,256*1024);
this.readableChannel =buf;
this.writableChannel =buf;
}else {
this.readableChannel=connectSocket;
this.writableChannel=connectSocket;
}
this.enableBuffer=enableBuffer;
connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true);
ThreadTool.makeVDaemonThread("连接超时计时线程", timeouter);
new KLALBOutputStream(Channels.newOutputStream(connectSocket));
new KLALBInputStream(Channels.newInputStream(connectSocket));
new KLALBOutputStream(Channels.newOutputStream(writableChannel));
if(writableChannel instanceof BufferedChannel)
((BufferedChannel) writableChannel).flush();
new KLALBInputStream(Channels.newInputStream(readableChannel));
}catch(Throwable e) {
connectSocket.close();
throw e;
}
}
@@ -115,28 +144,9 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
szeWrite.putInt(kp.limit());
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
connectSocket.write(new ByteBuffer[] {szeWrite,kp});
/*
if(connectSocket instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) connectSocket;
}
boolean isaflush=false;
if(obj!=null) {
isaflush=obj.isAutoFlush();
obj.setAutoFlush(false);
}
//connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,false);
connectSocket.write(szeWrite);
//connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true);
if(obj!=null) {
obj.setAutoFlush(true);
}
connectSocket.write(kp);
if(obj!=null) {
obj.setAutoFlush(isaflush);
}*/
writableChannel.write(new ByteBuffer[] {szeWrite,kp});
checkflush();
}
@@ -161,7 +171,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
bbfw[i<<1]=szeWrite;
bbfw[(i<<1)+1]=kpp[off+i];
}
connectSocket.write(bbfw);
writableChannel.write(bbfw);
}else {
for(int i=0;i<len;i++) {
bbfwx[i<<1].clear();
@@ -171,16 +181,17 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
bbfwx[i<<1].flip();
bbfwx[(i<<1)+1]=kpp[off+i];
}
connectSocket.write(bbfwx,0,len<<1);
writableChannel.write(bbfwx,0,len<<1);
}
checkflush();
}
private ByteBuffer szeRead=NetworkPacket.bufferAllocator.allocate(4);
@Override
public ByteBuffer readPacket() throws IOException {
ByteBuffer szeRead=NetworkPacket.bufferAllocator.allocate(4);
timeoutTimer=System.nanoTime();
timerenabled=true;
ByteBuffer kp;
@@ -188,35 +199,70 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
szeRead.limit(4);
//szeRead.clear();
try {
KNEChannels.readFully(connectSocket,szeRead);
KNEChannels.readFully(readableChannel,szeRead);
szeRead.flip();
int size=szeRead.getInt(0);
kp=NetworkPacket.bufferAllocator.allocate(size);
incInput(size);
kp.limit(size);
KNEChannels.readFully(connectSocket, kp);
KNEChannels.readFully(readableChannel, kp);
kp.flip();
return kp;
}finally {
timerenabled=false;
}
}
@Override
public void writeKLALBPackets(List<KLALBPacket> pkts) throws IOException {
KLALBVirtualSocketChannel obj = null;
if(writableChannel instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) writableChannel;
}
boolean isaflush=false;
if(obj!=null) {
isaflush=obj.isAutoFlush();
obj.setAutoFlush(false);
}
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
for(KLALBPacket kp:pkts) {
szeWrite.clear();
int length=(int) kp.getTotalLength();
incOutput(length);
szeWrite.putInt(length);
szeWrite.flip();
writableChannel.write(szeWrite);
KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp);
}
if(obj!=null) {
obj.flush();
}
/* @Override
checkflush();
if(obj!=null) {
obj.setAutoFlush(isaflush);
}
}
@Override
public void writeKLALBPacket(KLALBPacket kp) throws IOException {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
int length=(int) kp.getLength();
int length=(int) kp.getTotalLength();
incOutput(length);
szeWrite.putInt(length);
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
if(connectSocket instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) connectSocket;
if(writableChannel instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) writableChannel;
}
boolean isaflush=false;
if(obj!=null) {
@@ -224,30 +270,47 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
obj.setAutoFlush(false);
}
connectSocket.write(szeWrite);
writableChannel.write(szeWrite);
KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp);
if(obj!=null) {
obj.setAutoFlush(true);
obj.flush();
}
KLALBPacket.writeKLALBPacketToChannel(connectSocket, kp);
checkflush();
/*AtomicLong al=new AtomicLong(0);
KLALBPacket.writeKLALBPacketToChannel(new MonitoredChannel(connectSocket,null,new AtomicLong[] { al}), kp);
if(length!=al.get()) {
throw new StreamCorruptedException(kp+" packet length error:"+al.get()+"!="+length);
}*/
if(obj!=null) {
obj.setAutoFlush(isaflush);
}
}
private void checkflush() throws IOException {
if(writableChannel instanceof BufferedChannel) {
((BufferedChannel) writableChannel).flush();
}
}
@Override
public KLALBPacket readKLALBPacket() throws IOException {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
KNEChannels.readFully(connectSocket, szeWrite);
KNEChannels.readFully(readableChannel, szeWrite);
szeWrite.flip();
int readSize=szeWrite.getInt();
incInput(readSize);
return KLALBPacket.readKLALBPacketFromChannel(connectSocket);
}*/
KLALBPacket kp=KLALBPacket.readKLALBPacketFromChannel(readableChannel);
/*
long kpl=kp.getLength();
if(kpl!=readSize) {
throw new StreamCorruptedException(kp+" packet length error:"+kpl+"!="+readSize);
}*/
return kp;
}