[英]Java server handle different requests from client
我現在正在設計使用套接字的火車票預訂系統。 客戶可以搜索票,預訂票和取消票。 客戶端將向服務器發送不同的對象,例如SearchRequest,BookRequest和CancelRequest。 在服務器端,我希望有三個線程池來處理每個請求。 這是我處理搜索請求的方式。
searchserverSocket = new ServerSocket(search_portNum);
search_pool = Executors.newFixedThreadPool
(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
public void service(){
while(true){
Socket search_socket = null;
try{
search_socket = searchserverSocket.accept();
SearchHandler search_han = new SearchHandler(search_socket,search_request);
search_pool.submit(search_han);
}catch(IOException e){
e.printStackTrace();
}
}
}
我現在很困惑如何處理其他兩個請求。 我應該在其他端口上創建一個新的ServerSocket嗎? 服務器如何識別不同類型的請求?
從套接字中將獲得一個字節流,您需要使用該流來確定正在請求的操作-您需要設計一個協議。
您可以只使用Java類來定義協議,序列化實例並將字節寫入套接字,盡管如果執行此任務,我將使用Google Protocol Buffer 。 例如,您可以像這樣為每種請求類型定義消息(我猜您需要的字段):
message Search
{
required string destination = 1;
required string origin = 2;
...
}
message Book
{
required int32 trainId = 1;
required string destination = 2;
required string origin = 3;
...
}
message Cancel
{
required int32 bookingId = 1;
...
}
當擁有定義協議的類時,您需要考慮它們將如何以字節數組的形式出現,這是您從套接字中獲得的。 這里重要的是考慮框架,因為您的服務器有望收到請求流。 有兩種常見的方法-使用定界符標記每個消息的結尾,或者在每個消息之前以固定的字節數寫入消息的長度。 兩者都有其優點和缺點。
從套接字讀取消息后,就可以打開請求類型並調用適當的處理程序類。
我將向您介紹此鏈接http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html 。 閱讀整個教程
我認為您所缺少的一點是,您可以通過檢索其上的InputStream來在Socket中寫入數據,也可以使用其中的OutputStream來回讀信息。
您所需要的只是一種傳遞所需類型的請求,並從服務器端的流中讀取請求的方法。 您不需要任何花哨的內容,只需傳遞一個字符串:“ request = xxx”,然后在另一側進行解析。 這些實現細節供您確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.