如何将一个worker类注入ServerSocket实现?

时间:2011-12-30 17:12:04

标签: java dependency-injection serversocket

我正在寻找使用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的任何信息。任何建议将不胜感激......

1 个答案:

答案 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
    }
}

因此基本处理程序将是ClientHandlerProxyHandlerLineByLineHandler等可以提供更多功能。

希望这会有所帮助。对不起,如果这一切都很明显。评论,我将提高特异性水平。