2014-11-05 92 views
-1

我在一個Java項目的類中有一個ServerSocket。這個套接字接收一些導致新行爲的命令。例如:ServerSocket的最佳方法Java

deleteAllFromDB - >刪除DB上的所有條目。

sendMsgToX - >建立了一個發送到X.

像一個新的消息:

in = new Scanner(s.getInputStream()); 
message = in.next(); 

    if (message.equalsIgnoreCase("deleteAllFromDB"){ 
    //code 
    //more code 
    //even more code 
    } 
... 

好吧,我想你想到這個主意(這是相當簡單,但我使用示例因爲我的英語技能可能會讓觀衆感到困惑)。

問題是,類內部的方法變得越來越重,所以套接字不會讀取傳入的消息,直到方法執行完成。

我想我有2種方法來解決這個問題:

1.多線程服務器

而不是處理在同一個線程傳入的請求,接受客戶端連接時,連接交給處理請求的工作線程

http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

2.螺紋方法

一旦予讀取傳入請求(message=in.next()),I啓動一個線程負責的方法被執行(deleteFromDB, sendMsgToX等)。

任何意見將非常感激。另外,只需要提一下,我正在使用OSGi框架,即使你不認爲這與問題相關(以防萬一..)。

在此先感謝!

+0

你考慮使用OSGi外殼(勾勾)的支持,可以方便地掛接到一個插座會話? – 2014-11-05 13:28:57

+0

你期望同時有多少客戶? 你需要區分不同的客戶嗎?可以同時執行命令(因爲有一個數據庫你不得不擔心事務和原子性)? – Yuri 2014-11-05 16:13:40

+0

你有一個'Socket'。一個'ServerSocket'不能接收命令。 – EJP 2016-11-29 00:19:43

回答

0

您可以簡單地執行在ExecutorService中處理消息的代碼。

就像是:

//Outside the handler: 
pool = Executors.newFixedThreadPool(poolSize); 

// On message receipt 
message = in.next(); 
pool.execute(new MessageHandler(message)); 

所以,你可以通過設置poolSize很好地擴展。

所以我想這將是法2