Как внедрить рабочий класс в реализацию ServerSocket? - PullRequest
1 голос
/ 30 декабря 2011

Я хочу создать универсальный сервер TCP / IP с использованием ServerSocket, который может использоваться несколькими проектами, над которыми работает моя команда. Препятствие, с которым я сталкиваюсь, заключается в том, как лучше внедрить рабочий класс Runnable, поскольку различные проекты будут иметь разные функциональные возможности для взаимодействия с клиентом.

Вот что у меня сейчас:

Socket clientSocket = serverSocket.accept();
Runnable worker = WorkerFactory.getWorker(interfaceId, clientSocket, id);
Thread t = new Thread(worker, "Client #" + id);
t.start();

Передача interfaceId на сервер работает для подмножества проектов, но когда рассматриваются все возможные варианты использования, это не жизнеспособное решение.

Я думаю, что фабрика, использующая дженерики, или, возможно, каким-то образом использующая среду Spring, может быть подходящим способом, но я немного неопределена в том, как это сделать. Я искал и не смог ничего найти о введении рабочих для реализации ServerSocket. Любые предложения будут оценены ...

1 Ответ

0 голосов
/ 01 января 2012

Я не могу точно сказать, как далеко вы здесь, так что извините за очевидные утверждения.

Есть несколько способов, которыми вы можете пойти сюда.Это во многом зависит от того, сколько работы ваш серверный фреймворк хочет сделать для абонентов.Например, он может просто принять сокеты и затем вызвать 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 и т. Д.

Надеюсь, это поможет.Извините, если это все очевидно.Прокомментируйте и я увеличу уровень специфичности.

...