我正在编写如下的服务器
public class Server<T extends RequestHandler> {
public void start() {
try{
this.serverSocket = new ServerSocket(this.port, this.backLog);
} catch (IOException e) {
LOGGER.error("Could not listen on port " + this.port, e);
System.exit(-1);
}
while (!stopTheServer) {
socket = null;
try {
socket = serverSocket.accept();
handleNewConnectionRequest(socket);
} catch (IOException e) {
LOGGER.warn("Accept failed at: " + this.port, e);
e.printStackTrace();
}
}
}
protected void handleNewConnectionRequest(Socket socket) {
try {
executorService.submit(new T(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是在handleNewConnectionRequest(...)方法中,我无法创建T的实例,因为它实际上不是类.此外,我不能用上述的方法在这里,我想通过socket实例,以便请求处理程序可以得到OutputStream和InputStream上socket.
我不能像上面那样制作通用服务器,并且有不同的协议处理程序,例如
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
Run Code Online (Sandbox Code Playgroud)
然后像下面一样使用它们
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
Run Code Online (Sandbox Code Playgroud)
你需要一个类的实例.通用类型T是不够的.所以你会这样做:
class Server <T extends RequestHandler> {
Class<T> clazz;
public Server(Class<T> clazz) {
this.clazz = clazz;
}
private T newRequest() {
return clazz.newInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
也许使不同的Server子类适合各种处理程序类型.一个例子:
public class HttpServer extends Server<HttpRequestHandler> {
protected HttpRequestHandler wrapSocket(Socket socket) {
return new HttpRequestHandler(socket);
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样适应服务器:
public abstract class Server<T extends RequestHandler> {
protected abstract T wrapSocket(Socket socket);
protected void handleNewConnectionRequest(Socket socket) {
try {
executorService.submit(wrapSocket(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
只是一个想法...
| 归档时间: |
|
| 查看次数: |
28288 次 |
| 最近记录: |