Oracle网络TNS协议的几个基础类描述(revised)
首先是接口SQLnetDef,定义了参数
public interface SQLnetDef { public static final boolean DEBUG = false; public static final boolean ASSERT = false; public static final int NSPTCN = 1; public static final int NSPTAC = 2; public static final int NSPTAK = 3; public static final int NSPTRF = 4; public static final int NSPTRD = 5; public static final int NSPTDA = 6; public static final int NSPTNL = 7; public static final int NSPTAB = 9; public static final int NSPTRS = 11; public static final int NSPTMK = 12; public static final int NSPTAT = 13; public static final int NSPTCNL = 14; public static final int NSPTHI = 19; public static final byte NSPHDLEN = 0; public static final byte NSPHDPSM = 2; public static final byte NSPHDTYP = 4; public static final byte NSPHDFLGS = 5; public static final byte NSPHDHSM = 6; public static final byte NSPSIZHD = 8; public static final byte NO_HEADER_FLAGS = 0; public static final byte NSPCNVSN = 8; public static final byte NSPCNLOV = 10; public static final byte NSPCNOPT = 12; public static final byte NSPCNSDU = 14; public static final byte NSPCNTDU = 16; public static final byte NSPCNNTC = 18; public static final byte NSPCNTNA = 20; public static final byte NSPCNONE = 22; public static final byte NSPCNLEN = 24; public static final byte NSPCNOFF = 26; public static final byte NSPCNMXC = 28; public static final byte NSPCNFL0 = 32; public static final byte NSPCNFL1 = 33; public static final byte NSPCNDAT = 34; public static final int NSPMXCDATA = 230; public static final int NSINAWANTED = 1; public static final int NSINAINTCHG = 2; public static final int NSINADISABLEFORCONNECTION = 4; public static final int NSINANOSERVICES = 8; public static final int NSINAREQUIRED = 16; public static final int NSINAAUTHWANTED = 32; public static final byte NSPACVSN = 8; public static final byte NSPACOPT = 10; public static final byte NSPACSDU = 12; public static final byte NSPACTDU = 14; public static final byte NSPACONE = 16; public static final byte NSPACLEN = 18; public static final byte NSPACOFF = 20; public static final byte NSPACFL0 = 22; public static final byte NSPACFL1 = 23; public static final byte NSPRFURS = 8; public static final byte NSPRFSRS = 9; public static final byte NSPRFLEN = 10; public static final byte NSPRFDAT = 12; public static final byte NSPRDLEN = 8; public static final byte NSPRDDAT = 10; public static final int NSPDAFLG = 8; public static final int NSPDADAT = 10; public static final int NSPDAFZER = 0; public static final int NSPDAFTKN = 1; public static final int NSPDAFRCF = 2; public static final int NSPDAFCFM = 4; public static final int NSPDAFRSV = 8; public static final int NSPDAFMOR = 32; public static final int NSPDAFEOF = 64; public static final int NSPDAFIMM = 128; public static final int NSPDAFRTS = 256; public static final int NSPDAFRNT = 512; public static final int NSPMKTYP = 8; public static final int NSPMKODT = 9; public static final int NSPMKDAT = 10; public static final int NSPMKTD0 = 0; public static final int NSPMKTD1 = 1; public static final byte NIQBMARK = 1; public static final byte NIQRMARK = 2; public static final byte NIQIMARK = 3; public static final int NSPDFSDULN = 2048; public static final int NSPMXSDULN = 32767; public static final int NSPMNSDULN = 512; public static final int NSPDFTDULN = 32767; public static final int NSPMXTDULN = 32767; public static final int NSPMNTDULN = 255; public static final int NSPINSDULN = 255; public static final String TCP_NODELAY_STR = "TCP.NODELAY"; public static final String TCP_CONNTIMEOUT_STR = "oracle.net.CONNECT_TIMEOUT"; public static final String TCP_READTIMEOUT_STR = "oracle.net.READ_TIMEOUT"; public static final int TCP_NODELAY_OFF = 0; public static final int TCP_KEEPALIVE_OFF = 1; public static final int TCP_CONNTIMEOUT_OFF = 2; public static final int TCP_READTIMEOUT_OFF = 3; public static final int ORACLE_NET_NTMINOPT = 0; public static final int ORACLE_NET_READ_TIMEOUT = 1; public static final int ORACLE_NET_NTMAXOPT = 10; }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类型:
package oracle.net.ns; import java.io.*; import oracle.net.nl.RepConversion; // Referenced classes of package oracle.net.ns: // NetException, NetInputStream, SQLnetDef, SessionAtts public class Packet implements SQLnetDef { public Packet(Packet packet) { this(packet.sAtts); length = packet.length; type = packet.type; flags = packet.flags; dataLen = packet.dataLen; dataOff = packet.dataOff; buffer = packet.buffer; } public Packet(SessionAtts sessionatts) { header = new byte[8]; sAtts = sessionatts; sdu = sessionatts.getSDU(); tdu = sessionatts.getTDU(); } public Packet(SessionAtts sessionatts, int i) { this(sessionatts); createBuffer(i); } public Packet(SessionAtts sessionatts, int i, int j, int k) { this(sessionatts); createBuffer(i, j, k); } protected void createBuffer(int i) { buffer = new byte[i]; buffer[0] = (byte)(i / 256); buffer[1] = (byte)(i % 256); } protected void createBuffer(int i, int j, int k) { buffer = new byte[i]; buffer[0] = (byte)(i / 256); buffer[1] = (byte)(i % 256); buffer[5] = (byte)k; buffer[4] = (byte)j; } protected void dump(byte abyte0[], int i, int j) { int k = 0; System.out.println("Packet dump"); System.out.println("buffer.length=" + abyte0.length); System.out.println("offset =" + i); System.out.println("len =" + j); for(int l = i; l < j; l += 8 ) { System.out.print("|"); for(int i1 = 0; i1 < 8 && k < j - 1; i1++) { k = l + i1; RepConversion.printInHex(abyte0[k]); System.out.print(" "); } System.out.println("|"); } System.out.println("finish dump"); } protected void extractData() throws IOException, NetException { if(dataLen <= 0) data = new String(); else if(length > dataOff) { data = new String(buffer, 0, dataOff, dataLen); } else { byte abyte0[] = new byte[dataLen]; if(sAtts.nsInputStream.read(abyte0) < 0) throw new NetException(0); data = new String(abyte0, 0); } } protected String getData() { return data; } protected void receive() throws IOException, NetException { int i; for(i = 0; i < header.length;) try { if((i += sAtts.ntInputStream.read(header, i, header.length - i)) <= 0) throw new NetException(0); } catch(InterruptedIOException _ex) { throw new NetException(504); } length = header[0] & 0xff; length <<= 8; length |= header[1] & 0xff; type = header[4]; flags = header[5]; if(type > 19) throw new NetException(204); if(length > 32767 || length > sdu) throw new NetException(203); if(length < 8 ) throw new NetException(207); buffer[5] = (byte)flags; buffer[4] = (byte)type; while(i < length) try { if((i += sAtts.ntInputStream.read(buffer, i, length - i)) <= 0) throw new NetException(0); } catch(InterruptedIOException _ex) { } } protected void send() throws IOException { synchronized(sAtts.ntOutputStream) { sAtts.ntOutputStream.write(buffer, 0, buffer.length); } } private int buffer2send; protected int sdu; protected int tdu; protected int length; public int type; protected int flags; protected int dataLen; protected int dataOff; protected String data; protected byte buffer[]; protected byte header[]; public SessionAtts sAtts; }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.IOException; import java.io.PrintStream; // Referenced classes of package oracle.net.ns: // Packet, NetException, SQLnetDef, SessionAtts public class AcceptPacket extends Packet implements SQLnetDef { public AcceptPacket(Packet packet) throws IOException, NetException { super(packet); version = super.buffer[8] & 0xff; version <<= 8; version |= super.buffer[9] & 0xff; options = super.buffer[10] & 0xff; options <<= 8; options |= super.buffer[11] & 0xff; sduSize = super.buffer[12] & 0xff; sduSize <<= 8; sduSize |= super.buffer[13] & 0xff; tduSize = super.buffer[14] & 0xff; tduSize <<= 8; tduSize |= super.buffer[15] & 0xff; myHWByteOrder = super.buffer[16] & 0xff; myHWByteOrder <<= 8; myHWByteOrder |= super.buffer[17] & 0xff; super.dataLen = super.buffer[18] & 0xff; super.dataLen <<= 8; super.dataLen |= super.buffer[19] & 0xff; super.dataOff = super.buffer[20] & 0xff; super.dataOff <<= 8; super.dataOff |= super.buffer[21] & 0xff; flag0 = super.buffer[22]; flag1 = super.buffer[23]; extractData(); super.sAtts.setSDU(sduSize); super.sAtts.setTDU(tduSize); if(tduSize < sduSize) super.sAtts.setSDU(tduSize); } protected int version; protected int options; protected int sduSize; protected int tduSize; protected int myHWByteOrder; protected int flag0; protected int flag1; }Data Packet 数据包类:
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或其他语言下也是类似结构,只是实现略有不同。
posted on 2010-11-05 11:01 Oracle和MySQL 阅读(527) 评论(0) 编辑 收藏 举报