您的位置:首页 > 理论基础 > 计算机网络

Oracle网络TNS协议的几个基础类描述(revised)

2010-11-05 11:01 1091 查看
首先是接口SQLnetDef,定义了参数

Session 类描述:
package oracle.net.ns;

import java.io.*;
import oracle.net.ano.Ano;
import oracle.net.nt.ConnOption;
import oracle.net.nt.NTAdapter;

// Referenced classes of package oracle.net.ns:
//            NetException, SQLnetDef, NetInputStream, NetOutputStream,
//            ClientProfile

public class SessionAtts
implements SQLnetDef
{

public SessionAtts(int i, int j)
{
sdu = i;
tdu = j;
}

public int getANOFlags()
{
int i = 1;
if(ano != null)
i = ano.getNAFlags();
return i;
}

public InputStream getInputStream()
{
return nsInputStream;
}

public NTAdapter getNTAdapter()
{
return nt;
}

public OutputStream getOutputStream()
{
return nsOutputStream;
}

public int getSDU()
{
return sdu;
}

public int getTDU()
{
return tdu;
}

public void print()
{
System.out.println("Session Attributes: ");
System.out.println("sdu            : " + sdu);
System.out.println("tdu            : " + tdu);
System.out.println("nt             : " + nt);
System.out.println("ntInputStream  : " + ntInputStream);
System.out.println("ntOutputStream : " + ntOutputStream);
System.out.println("nsInputStream  : " + nsInputStream);
System.out.println("nsOutputStream : " + nsOutputStream);
System.out.println("profile        : " + profile);
System.out.println("cOption        : " + cOption);
System.out.println("onBreakReset   : " + onBreakReset);
System.out.println("dataEOF        : " + dataEOF);
System.out.println("connected      : " + connected);
}

public void setSDU(int i)
{
if(i <= 0)
sdu = 2048;
else
if(i > 32767)
sdu = 32767;
else
if(i < 512)
sdu = 512;
else
sdu = i;
}

public void setTDU(int i)
{
if(i <= 0)
tdu = 32767;
else
if(i > 32767)
tdu = 32767;
else
if(i < 255)
tdu = 255;
else
tdu = i;
}

public void turnEncryptionOn(NetInputStream netinputstream, NetOutputStream netoutputstream)
throws NetException
{
if(netinputstream != null && netoutputstream != null)
{
nsInputStream = netinputstream;
nsOutputStream = netoutputstream;
} else
{
throw new NetException(300);
}
}

private int sdu;
private int tdu;
protected NTAdapter nt;
protected InputStream ntInputStream;
protected OutputStream ntOutputStream;
protected NetInputStream nsInputStream;
protected NetOutputStream nsOutputStream;
protected ConnOption cOption;
protected boolean dataEOF;
protected boolean connected;
public boolean onBreakReset;
public ClientProfile profile;
public Ano ano;
public boolean anoEnabled;
public boolean isEncryptionActive;
public boolean isChecksumActive;
public boolean areEncryptionAndChecksumActive;
}

基础Packet类型:
Connect Packet 连接包描述:
package oracle.net.ns;

import java.io.IOException;
import java.io.PrintStream;
import oracle.net.nt.ConnOption;

// Referenced classes of package oracle.net.ns:
//            Packet, NetOutputStream, SQLnetDef, SessionAtts

public class ConnectPacket extends Packet
implements SQLnetDef
{

public ConnectPacket(SessionAtts sessionatts)
{
super(sessionatts);
super.data = sessionatts.cOption.conn_data.toString();
super.dataLen = super.data != null ? super.data.length() : 0;
connDataOflow = super.dataLen > 230;
int i = connDataOflow ? 34 : 34 + super.dataLen;
createBuffer(i, 1, 0);
super.buffer[8] = 1;
super.buffer[9] = 52;
super.buffer[10] = 1;
super.buffer[11] = 44;
super.buffer[12] = 0;
super.buffer[13] = 0;
super.buffer[14] = (byte)(super.sdu / 256);
super.buffer[15] = (byte)(super.sdu % 256);
super.buffer[16] = (byte)(super.tdu / 256);
super.buffer[17] = (byte)(super.tdu % 256);
super.buffer[18] = 79;
super.buffer[19] = -104;
super.buffer[22] = 0;
super.buffer[23] = 1;
super.buffer[24] = (byte)(super.dataLen / 256);
super.buffer[25] = (byte)(super.dataLen % 256);
super.buffer[27] = 34;
if(!sessionatts.anoEnabled)
super.buffer[32] = super.buffer[33] = 4;
else
super.buffer[32] = super.buffer[33] = (byte)sessionatts.getANOFlags();
if(!connDataOflow && super.dataLen > 0)
super.data.getBytes(0, super.dataLen, super.buffer, 34);
}

protected void send()
throws IOException
{
super.send();
if(connDataOflow)
{
byte abyte0[] = new byte[super.dataLen];
super.data.getBytes(0, super.dataLen, abyte0, 0);
super.sAtts.nsOutputStream.write(abyte0);
super.sAtts.nsOutputStream.flush();
}
}

private boolean connDataOflow;
}

接受包类:
package oracle.net.ns;

import java.io.*;

// Referenced classes of package oracle.net.ns:
//            Packet, NetException, SQLnetDef, SessionAtts

public class DataPacket extends Packet
implements SQLnetDef
{

public DataPacket(SessionAtts sessionatts)
{
this(sessionatts, sessionatts.getSDU());
}

public DataPacket(SessionAtts sessionatts, int i)
{
super(sessionatts, i, 6, 0);
isBufferFull = false;
isBufferEmpty = false;
availableBytesToSend = 0;
availableBytesToRead = 0;
initialize(i);
}

protected int getDataFromBuffer(byte abyte0[], int i, int j)
throws NetException
{
int k = super.length - pktOffset > j ? j : super.length - pktOffset;
if(k > 0)
{
System.arraycopy(super.buffer, pktOffset, abyte0, i, k);
pktOffset += k;
isBufferEmpty = pktOffset == super.length;
availableBytesToRead = (super.dataOff + super.dataLen) - pktOffset;
}
return k;
}

protected void initialize(int i)
{
super.dataOff = pktOffset = 10;
super.dataLen = i - super.dataOff;
dataFlags = 0;
}

protected int putDataInBuffer(byte abyte0[], int i, int j)
throws IOException
{
int k = super.buffer.length - pktOffset > j ? j : super.buffer.length - pktOffset;
if(k > 0)
{
System.arraycopy(abyte0, i, super.buffer, pktOffset, k);
pktOffset += k;
isBufferFull = pktOffset == super.buffer.length;
availableBytesToSend = super.dataOff >= pktOffset ? 0 : pktOffset - super.dataOff;
}
return k;
}

protected void receive()
throws IOException, NetException
{
super.receive();
super.dataOff = pktOffset = 10;
super.dataLen = super.length - super.dataOff;
dataFlags = super.buffer[8] & 0xff;
dataFlags <<= 8;
dataFlags |= super.buffer[9] & 0xff;
if((dataFlags & 0x40) != 0)
super.sAtts.dataEOF = true;
if(super.type == 6 && super.dataLen == 0)
super.type = 7;
}

protected void send()
throws IOException
{
send(0);
}

protected void send(int i)
throws IOException
{
super.buffer[8] = (byte)(i / 256);
super.buffer[9] = (byte)(i % 256);
setBufferLength(pktOffset);
synchronized(super.sAtts.ntOutputStream)
{
super.sAtts.ntOutputStream.write(super.buffer, 0, pktOffset);
}
pktOffset = 10;
availableBytesToSend = 0;
isBufferFull = false;
}

protected void setBufferLength(int i)
throws NetException
{
super.buffer[0] = (byte)(i / 256);
super.buffer[1] = (byte)(i % 256);
}

static final boolean DEBUG2 = false;
protected int pktOffset;
protected int dataFlags;
protected boolean isBufferFull;
protected boolean isBufferEmpty;
protected int availableBytesToSend;
protected int availableBytesToRead;
}

以上类描述可以通过反编译jdbc包获得,实际数据结构是通用的即在C或其他语言下也是类似结构,只是实现略有不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐