2012-05-30 83 views
0

當創建Java中的一個獨立的服務器(不使用如Tomcat /碼頭集裝箱),有什麼不同的技術來保證業務正常運行,沒有不散?創建服務器,技術來保證運行的服務(或阻止?)

我看到人們使用一個ServerSocket(因爲你將有大概的服務進行通信),以及他們使用的ServerSocket.accept(),該塊,直到它接收的消息。

while(...) { 
    serverSocket.accept(); 
} 

http://docs.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#accept()

這是唯一的方法:這是在一個while循環通常做什麼?如果不是,還有什麼其他的方式和利弊呢?

是否有與構建自己的服務,或它幾乎滾你自己的幫助任何庫。

+0

是使用套接字的主要要求?有一些使用JMS服務器發送/接收消息的技術。 –

+0

沒有要求,我只想知道創建自己的自定義服務器時有什麼選項。 – loyalflow

+0

好吧,沒有提到的一個選項是使用像Apache ActiveMQ這樣的JMS服務器。你不需要管理任何套接字。您創建隊列和偵聽器,並且您的服務器等待消息處理。 –

回答

1

有一些幫助你滾你自己的Windows/Unix的服務於Java的各種庫:

你如何保持應用程序的運行依賴於您的應用程序的實際需求。如果您的應用程序是服務器,您通常會希望監聽通常涉及某種阻止/輪詢的傳入連接。你如何做到這一點取決於你想要建立的服務器的類型。通用解決方案中有ServerSocket類及其方法accept(),您已經提到過。另一種可能性是使用java.nio中和實施的反應器,其提供了可以一次處理多個連接的單個線程服務器(見http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf的詳細信息),但也可以是有點難以把握和調試。

1

你可能想要的是一個多線程的服務器。 服務器每次接受連接時,服務器都會創建一個線程來處理髮送/接收到該客戶端。如果您在服務器中不使用線程,則它一次只能處理一個連接。 因此,當你meantioned,服務器infinitly循環和監聽進來的連接:

while(true){ 
    serverSocket.accept(); 
    ClientHandler c = new ClientHandler(serverSocket); 

類ClientHandler中的一個實例將每一個連接被接受時創建的。這個類實現Runnable接口,並且循環對於插座上進來的使用的getInputStream和getOutputStream方法的消息:

public class ClientHandler implements Runnable{ 
DataInputStream in; 
DataOutputStream out; 

//ClientHandler constructor 
    public ClientHandler(Socket s) throws IOException{ 
     in= new DataInputStream(socket.getInputStream()); 
     out=new DataOutputStream(socket.getOutputStream()); 
     thread.start(); 
} 

run方法:

public void run() { 
    while(true){ 
     String temp=""; 
     while ((temp = (String) in.readUTF()) != null){ // Read from the input stream each iteration. When temp is not null a message is recived    
      System.out.println(temp); 

請上面的代碼並沒有考慮到不同的異常可能發生並且非常基本。但它應該給你一個關於如何使用套接字的服務器可以實現的基本想法。

1

對於一個快速的解決方案(在測試環境中唯一的!),你可以去的東西經常被稱爲「企業循環」(因爲它是在生產系統中經常發現):

while (true) 
    try { 
     // do something 
    } catch (Throwable t) { 
     // maybe log 
    } 

然而,這在生產代碼中不是很好的風格。 (請參閱[1]瞭解該慣用語的模仿效果)

要創建服務,您需要this answer的其中一個庫。

如果您「只需要多線程」,請查看Java併發性框架。我強烈建議閱讀Java Concurrency in Practice,因爲多線程更多的是剛開始另一個線程,錯誤很難調試。

[1] http://blog.antiblau.de/2016/01/26/java-enterprise-loop/