程序想實現的效果:客戶端現在有一個對象“狗”,加入了一個LinkedList集合,隨後將該集合發送到服務器端。服務器端接收到這個集合,會調用一個方法Judge來判斷LinkedList裡面有什麼,如果是狗則調用XXX方法,如果是貓則調用XXX方法。
問題描述:現在客戶端與服務器端單獨抽出成為一個jar工具包。也就是說服務器端和客戶端會預先寫好。換而言之,在該包裡沒有Judge方法,Judge方法是在程序實際編寫時再寫成的。那麼此時服務器端代碼應該怎麼寫?
實際應用舉例:當實際使用時,應用程序(客戶端)調用Send(),此時該jar包中已編好的程序會將對象發送到服務器端;在服務器端只需寫一個Judge(),該方法會被jar包中的程序自動調用。
大體實現的代碼:
客戶端:
//向服務器發送數據
public void send(TransferLinkedList linkedList) throws IOException{
/**
* 本方法用於客戶端向服務器發送數據。首先從套接字中獲取基本輸出流,接下來將該輸出流轉換為對象輸出流以輸出對象
*/
//從該套接字中獲取輸出流
OutputStream clientOut = client.getOutputStream();
//將該輸出流處理為對象輸出流
ObjectOutputStream clientOutObject = new ObjectOutputStream(clientOut);
//傳輸信息
clientOutObject.writeObject(linkedList);
//刷新緩存區
clientOutObject.flush();
//接收服務器信息以確認是否成功發送信息
}
服務器端:
//開始運行
public void run() throws IOException{
//服務器一直等待客戶端的連接,當與客戶端建立連接時,服務器分出一個線程建立新的Socket進行處理,原有Socket繼續等待
//此處為了簡便省略線程
while(true){
Socket socket = server.accept();
//處理新的Socket
/**
* 調用Judge方法,Judge方法應在實際使用該jar包時編寫
* 此時不知道Judge包含哪些方法,是怎麼樣的路徑,甚至名字是否是Judge
* 該使用什麼方法來處理?反射?工廠模式?感覺都不大能解決
*/
}
}
你這個問題實際上就是要定義一個遠程調用協議
1.在客戶段給發送信息前面加一個頭,例如:
@header@type:methodinvoke@服務端的類@服務端的方法@參數列表@end@header@
2.在服務端接受客戶段信息時,判斷一下頭部是否有如上頭,如果有,按照協議解析,
然後根據解析內容通過反射調用客戶段請求的邏輯執行
此外,服務端最好使用線程池處理客戶段請求
在類中定義線程池常量
private static ExecutorService executoService;
在調用具體邏輯時
executoService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 10);
executoService.execute(new SocketThread(socket));