This commit is contained in:
Administrator
2025-04-24 10:16:38 +08:00
parent 6de65562be
commit 7267aec1fd
108 changed files with 7621 additions and 1890 deletions
@@ -1,6 +1,7 @@
package org.kne.cloud.network.klalb;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
@@ -19,14 +20,19 @@ import java.nio.channels.Channels;
import java.nio.channels.SocketChannel;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicLong;
import org.kne.cloud.network.ByteBufferAllocator;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.TimeoutTimer;
import org.kne.io.KNEChannels;
public class StreamChannelKLALBPacketLink implements KLALBPacketLink {
public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink {
private volatile long timeoutTimer;
private volatile boolean timerenabled=false;
private Thread timeouter=new Thread() {
private Runnable timeouter=new Runnable() {
public void run() {
timeoutTimer=System.nanoTime();
while(connectSocket.isOpen()) {
@@ -38,7 +44,7 @@ public class StreamChannelKLALBPacketLink implements KLALBPacketLink {
}
}
try {
Thread.sleep(1);
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -59,29 +65,13 @@ public class StreamChannelKLALBPacketLink implements KLALBPacketLink {
public StreamChannelKLALBPacketLink(SocketChannel connectSocket) throws IOException {
this.connectSocket=connectSocket;
connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true);
timeouter.start();
ThreadTool.makeVDaemonThread("连接超时计时线程", timeouter);
new KLALBOutputStream(Channels.newOutputStream(connectSocket));
new KLALBInputStream(Channels.newInputStream(connectSocket));
}
@Override
public void writePacket(KLALBPacket kp) throws IOException {
KLALBPacket.writeKLALBPacketToChannel(connectSocket, kp);
}
@Override
public KLALBPacket readPacket() throws IOException {
timeoutTimer=System.nanoTime();
timerenabled=true;
KLALBPacket res;
try {
res=KLALBPacket.readKLALBPacketFromChannel(connectSocket);
}finally {
timerenabled=false;
}
return res;
}
@Override
public void close() throws IOException {
@@ -113,5 +103,136 @@ public class StreamChannelKLALBPacketLink implements KLALBPacketLink {
public boolean isStream() {
return true;
}
@Override
public void writePacket(ByteBuffer kp) throws IOException {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
incOutput(kp.limit());
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);
}*/
}
@Override
public void writePackets(ByteBuffer[] kpp,int off,int len) throws IOException {
ByteBuffer[] bbfw=new ByteBuffer[len<<1];
for(int i=0;i<len;i++) {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
incOutput(kpp[off+i].limit());
szeWrite.putInt(kpp[off+i].limit());
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
bbfw[i*2]=szeWrite;
bbfw[i*2+1]=kpp[i];
}
connectSocket.write(bbfw);
}
@Override
public ByteBuffer readPacket() throws IOException {
timeoutTimer=System.nanoTime();
timerenabled=true;
ByteBuffer kp;
ByteBuffer szeRead=NetworkPacket.bufferAllocator.allocate(4);
szeRead.limit(4);
//szeRead.clear();
try {
KNEChannels.readFully(connectSocket,szeRead);
szeRead.flip();
int size=szeRead.getInt(0);
kp=NetworkPacket.bufferAllocator.allocate(size);
incInput(size);
kp.limit(size);
KNEChannels.readFully(connectSocket, kp);
kp.flip();
return kp;
}finally {
timerenabled=false;
}
}
/* @Override
public void writeKLALBPacket(KLALBPacket kp) throws IOException {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
int length=(int) kp.getLength();
incOutput(length);
szeWrite.putInt(length);
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
if(connectSocket instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) connectSocket;
}
boolean isaflush=false;
if(obj!=null) {
isaflush=obj.isAutoFlush();
obj.setAutoFlush(false);
}
connectSocket.write(szeWrite);
if(obj!=null) {
obj.setAutoFlush(true);
}
KLALBPacket.writeKLALBPacketToChannel(connectSocket, kp);
if(obj!=null) {
obj.setAutoFlush(isaflush);
}
}
@Override
public KLALBPacket readKLALBPacket() throws IOException {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
KNEChannels.readFully(connectSocket, szeWrite);
szeWrite.flip();
int readSize=szeWrite.getInt();
incInput(readSize);
return KLALBPacket.readKLALBPacketFromChannel(connectSocket);
}*/
}