package guang.crawler.jsonServer;
import guang.crawler.localConfig.ComponentLoader;
import guang.crawler.util.StreamHelper;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketTimeoutException;
/**
* 该类对每个连接进行处理.
*
* @author yang
*
*/
public class AcceptRequestHandler implements Runnable {
/**
* 当前连接的套接字
*/
private Socket client;
/**
* Commandlet的加载器
*/
private ComponentLoader<Commandlet> commandletLoader;
/**
* 线程控制器
*/
private final AcceptThreadController acceptThreadController;
/**
* 创建一个请求处理器.
*
* @param client
* 客户端套接字
* @param commandletLoader
* Commandlet的加载器
* @param acceptThreadController
* 线程控制器
* @throws IOException
*/
public AcceptRequestHandler(final Socket client,
final ComponentLoader<Commandlet> commandletLoader,
final AcceptThreadController acceptThreadController)
throws IOException {
this.client = client;
this.commandletLoader = commandletLoader;
this.acceptThreadController = acceptThreadController;
}
/**
* 关闭套接字.
*/
private void doExit() {
try {
this.client.close();
} catch (IOException e) {
return;
}
}
/**
* 线程主体部分,对一次请求进行处理:获取请求内容,找到处理该请求的类,处理完成后将结果返回给客户端.
*/
@Override
public void run() {
// 如果当前已经控制要结束了,那么就直接结束。
if (this.acceptThreadController.getType() != AcceptThreadController.TYPE_START) {
this.doExit();
return;
}
try {
// 获取请求内容
DataPacket data = null;
try {
data = StreamHelper.readObject(this.client.getInputStream(),
DataPacket.class);
} catch (SocketTimeoutException e) {
return;
} catch (Exception e) {
data = null;
}
if (data == null) {
return;
}
// 根据请求内容加载相应的Commandlet
Commandlet commandlet = this.commandletLoader.getComponent(data.getTitle());
DataPacket result = null;
// 处理该请求
if (commandlet == null) {
result = DataPacket.NOT_FOUND_PACKET;
} else {
result = commandlet.doCommand(data);
}
// 将处理结果返回
if (result != null) {
try {
StreamHelper.writeObject(this.client.getOutputStream(),
result);
} catch (IOException e) {
return;
}
}
} finally {
this.doExit();
}
}
}