在server类的handleConnection方法中处理客户端的输入,
首先调用allowConnection方法检测下客户端ip是否合法,ServerAcl类中可以查看,在server启动输入参数中可以指定acl 黑白名单ip文件,检测代码很简单,这里就不说明了,有兴趣的看下ServerAcl类。
protected boolean allowConnection(Socket socket) {
if (isShuttingDown) {
return false;
}
return (acl == null) ? true
: acl.permitAccess(
socket.getInetAddress().getAddress());
}
然后通过参数判断server启动模式,是hsql模式还是http模式,其实就是启动端口不一样,然后格式不一样而已。
if (serverProtocol == ServerConstants.SC_PROTOCOL_HSQL) {
r = new ServerConnection(s, this);
ctn = ((ServerConnection) r).getConnectionThreadName();
} else {
r = new WebServerConnection(s, (WebServer) this);
ctn = ((WebServerConnection) r).getConnectionThreadName();
}
t = new Thread(serverConnectionThreadGroup, r, ctn);
t.start();
启动一个新线程处理客户端连接,我们先看看ServerConnection的处理,每个ServerCOnnection会保存一个线程递增的id,然后往server添加当前连接
mThread = mCurrentThread.getAndIncrement();
synchronized (server.serverConnSet) {
server.serverConnSet.add(this);
}
看看run方法,init是处理第一次连接的请求,后面while循环处理该连接的下一个请求,最后close方法关闭连接。
public void run() {
int msgType;
init();
if (session != null) {
try {
while (keepAlive) {
msgType = dataInput.readByte();
if (msgType < ResultConstants.MODE_UPPER_LIMIT) {
receiveResult(msgType);
} else {
receiveOdbcPacket((char) msgType);
}
}
......
close();
} init方法,handshake 方法是查下当前连接请求时哪种类型的连接
