0

Java でスタンドアロン サーバーを作成する場合 (tomcat/jetty のようなコンテナーを使用しない場合)、サービスを実行し続けて終了しないためのさまざまな手法は何ですか?

私は人々が ServerSocket を使用する場所を見てきました (おそらくサービスと通信するため)、メッセージを受信するまでブロックする ServerSocket.accept() を使用します。そして、これは通常 while ループで行われます:

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

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

これが唯一の方法ですか?そうでない場合、他にどのような方法があり、それに関する長所/短所はありますか?

独自のサービスを構築するのに役立つライブラリはありますか、それともほとんどが独自のものです。

4

3 に答える 3

2

独自の Windows/Unix サービスを Java で展開するのに役立つさまざまなライブラリがあります。

アプリケーションを実行し続ける方法は、アプリケーションの実際のニーズによって異なります。アプリケーションがサーバーの場合、通常、何らかのブロッキング/ポーリングを伴う着信接続をリッスンする必要があります。再度行う方法は、構築するサーバーの種類によって異なります。一般的なソリューションには、既に言及した ServerSocket クラスとそのメソッド accept() があります。もう 1 つの可能性は、java.nio を使用して、一度に複数の接続を処理できるシングルスレッド サーバーを提供するリアクターを実装することです (詳細については、http: //gee.cs.oswego.edu/dl/cpjslides/nio.pdfを参照してください)。 、しかし、把握してデバッグするのは少し難しいかもしれません。

于 2012-05-30T15:25:01.163 に答える
1

簡単な解決策として (テスト環境のみで!)、「エンタープライズ ループ」と呼ばれることが多いものを使用できます (実稼働システムでよく見られるため)。

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

ただし、これは製品コードでは適切なスタイルではありません。(そのイディオムのパロディについては [1] を参照)

サービスを作成するには、この回答のライブラリの 1 つが必要です。

「マルチスレッドが必要なだけ」の場合は、Java 並行性フレームワークを調べてください。マルチスレッドは別のスレッドを開始するだけではなく、エラーをデバッグするのが難しいため、Java Concurrency in Practiceを読むことを強くお勧めします。

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

于 2016-01-26T14:15:39.803 に答える
1

おそらく必要なのは、マルチスレッド サーバーです。サーバーが接続を受け入れるたびに、サーバーはそのクライアントへの送受信を処理するスレッドを作成します。サーバーでスレッドを使用しない場合、一度に 1 つの接続しか処理できません。したがって、あなたが言ったように、サーバーは無限にループし、着信接続をリッスンします。

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();
}

実行方法:

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);

上記のコードは、発生する可能性のあるさまざまな例外を考慮しておらず、非常に基本的なものであることに注意してください。ただし、ソケットを使用するサーバーを実装する方法についての基本的な考え方は理解できるはずです。

于 2012-05-30T14:35:37.137 に答える