📄 sqlproxy.java
字号:
package net.sourceforge.jtds.tools;
import java.io.*;
import java.net.*;
public class SQLProxy
{
static final int LOCAL_PORT = 1433;
static final String SERVER = "server";
static final int SERVER_PORT = 1433;
public static void main(String args[]) throws IOException
{
ServerSocket sock = new ServerSocket(LOCAL_PORT);
while( true )
{
Socket s = sock.accept();
new DumpThread(s).start();
}
}
}
class DumpThread extends Thread
{
private Socket client, server;
private byte[] buf = new byte[4096];
DumpThread(Socket client)
{
this.client = client;
}
String hex(int value, int len)
{
String res = Integer.toHexString(value);
while( res.length() < len )
res = '0' + res;
return res.toUpperCase();
}
String packetType(int value)
{
switch( value )
{
case 0x01:
return "4.2 or 7.0 query";
case 0x02:
return "4.2 or 7.0 login packet";
case 0x04:
return "Server response";
case 0x06:
return "Cancel";
case 0x0F:
return "5.0 query";
case 0x10:
return "7.0 login packet";
default:
return "Unknown (0x"+hex(value, 2)+')';
}
}
int passByte(InputStream in, OutputStream out) throws IOException
{
int res = in.read();
out.write(res);
return res;
}
void skip(int len, InputStream in, OutputStream out) throws IOException
{
while( len > 0 )
{
int rd = in.read(buf, 0, len>buf.length ? buf.length : len);
// for( int i=0; i<rd; i++ )
// System.out.print((char)buf[i]);
// System.out.println();
// for( int i=0; i<rd; i++ )
// System.out.print(hex(((int)buf[i])&0xFF, 2)+" ");
// System.out.println();
out.write(buf, 0, rd);
len -= rd;
}
}
boolean nextPacket(InputStream in, OutputStream out) throws IOException
{
int type = passByte(in, out),
last = passByte(in, out);
int size = passByte(in, out)<<8 | passByte(in, out);
buf[0] = (byte)passByte(in, out);
buf[1] = (byte)passByte(in, out);
buf[2] = (byte)passByte(in, out);
buf[3] = (byte)passByte(in, out);
System.out.println("Packet type: "+packetType(type));
System.out.println("Packet size: "+size+" (0x"+hex(size, 4)+")");
System.out.print("Rest of header:");
for( int i=0; i<4; i++ )
System.out.print(" 0x"+hex(((int)buf[i])&0xFF, 2));
System.out.println();
skip(size-8, in, out);
return last==0;
}
public void run()
{
try
{
server = new Socket(SQLProxy.SERVER, SQLProxy.SERVER_PORT);
InputStream cIn = client.getInputStream();
OutputStream cOut = client.getOutputStream();
InputStream sIn = server.getInputStream();
OutputStream sOut = server.getOutputStream();
while( true )
{
while( nextPacket(cIn, sOut) );
System.out.println("--- Client done. ---\n");
while( nextPacket(sIn, cOut) );
System.out.println("--- Server done. ---\n");
}
}
catch( IOException ex )
{
try{ client.close(); }catch( IOException exc ){}
try{ server.close(); }catch( IOException exc ){}
System.out.println("Disconnected.");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -