2011-12-30 4 views
1

Я ищу для создания общего сервера TCP/IP с использованием ServerSocket, который может использоваться несколькими проектами, над которыми работает моя команда. Сбой, с которым я столкнулся, - это то, как лучше всего вводить рабочий класс Runnable, поскольку различные проекты будут иметь разную функциональность для взаимодействия с клиентом.Как ввести рабочий класс в реализацию ServerSocket?

Вот что я получил в настоящее время:

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

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

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

ответ

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 и т.д ..

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

Смежные вопросы