簡體   English   中英

Java服務器處理來自客戶端的不同請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM