我正在寻找使用ServerSocket创建一个通用的TCP / IP服务器,可以由我的团队正在处理的多个项目使用。我面临的障碍是如何最好地注入Runnable工作者类,因为各种项目将具有与客户端交互的不同功能。
这就是我现在所拥有的:
Socket clientSocket = serverSocket.accept();
Runnable worker = WorkerFactory.getWorker(interfaceId, clientSocket, id);
Thread t = new Thread(worker, "Client #" + id);
t.start();
将interfaceId
传递到服务器适用于项目的子集,但是当考虑所有可能的用途时,它不是一个可行的解决方案。
我在想一个使用泛型的工厂,或者可能以某种方式使用Spring框架,可能是要走的路,但我对如何解决这个问题有点模糊。我已经搜索过,而且我一直无法找到有关为ServerSocket实现注入worker的任何信息。任何建议将不胜感激......
答案 0 :(得分:0)
我不知道你在这里有多远,所以请原谅明显的陈述。
您可以通过多种方式前往此处。这很大程度上取决于您的服务器框架要为调用者做多少工作。例如,它可以只接受套接字,然后使用handle
或相关的输入和输出流调用Socket
。或者你的框架可以将一个对象和一组接口用于代理。客户端可以发送一个字符串和一组对象,您可以在注入的代理上调用方法。
您似乎暗示某些客户端可以作为代理接口处理,但其他客户端需要对输入/输出流进行较低级别的访问。因此,您可以拥有客户端必须实现的最简单的ClientHandler
接口:
public interface ClientHandler {
public void handleClient(InputStream, OutputStream) throws Exception;
}
然后,您的框架可以提供各种实现/包装器。一个可以是代理处理程序,它将客户端调用作为ObjectInputStream
和输出流来处理。客户端可以为参数编写方法名称和对象数组:
public class ProxyHandler implements ClientHandler {
private Object handler;
public ProxyHandler(Object handler) {
this.handler = handler;
}
public void handleClient(InputStream input, OutputStream output) throws Exception {
// creates the object i/o streams
// reads method string, object array, looks up methods in the handler obj by name
// loop until done
}
}
该框架可以提供处理逐行协议等的其他处理程序。
public interface LineByLineHandler {
public String handleLine(String line);
}
包装器:
public class LineByLineHandlerWrapper implements ClientHandler {
private LineByLineHandler handler;
public ProxyHandler(LineByLineHandler handler) {
this.handler = handler;
}
public void handleClient(InputStream input, OutputStream output) throws Exception {
// creates the buffered i/o reader/writes
// reads a string string, calls the handler, writes the response
// loop until done
}
}
因此基本处理程序将是ClientHandler
,ProxyHandler
,LineByLineHandler
等可以提供更多功能。
希望这会有所帮助。对不起,如果这一切都很明显。评论,我将提高特异性水平。