2016-08-10 9 views
0

シナリオ:
A)永続的な接続
b)は個別
C各クライアント間通信を管理する)例外/エラー
2つの異なるポートでリスニングするJavaソケットサーバーの2つのインスタンスを実行するにはどうすればよいですか。

を伝播からシステムを保護私が使用してサーバソケットリスナーの2つのインスタンスを作成しようとしました次のコード:

SimpleSocketServers.java

public class SimpleSocketServers { 

    public static void main(String[] args) throws Exception { 
     int port1 = 9876; 
     SimpleSocketServer server1 = new SimpleSocketServer(port1); 
     server1.startAndRunServer(); 
     System.out.println("Servers : server1 Listening on port: " + port1); 

     int port2 = 9875; 
     SimpleSocketServer server2 = new SimpleSocketServer(port2); 
     server2.startAndRunServer(); 
     System.out.println("Servers : server2 Listening on port: " + port2); 
    } 
} 


SimpleSocketServer.java

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.io.PrintWriter; 
    import java.net.ServerSocket; 
    import java.net.Socket; 

    public class SimpleSocketServer { 

     private ServerSocket serverSocket; 
     private int port; 

     public SimpleSocketServer(int port) { 
      this.port = port; 
     } 

     public void startAndRunServer() { 
      try { 
       System.out.println("Starting Server at port " + port + " ..."); 
       serverSocket = new ServerSocket(port); 
       System.out.println("Listening for client connection ..."); 
       Socket socket = serverSocket.accept(); 
       RequestHandler requestHandler = new RequestHandler(socket); 
       requestHandler.start(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

class RequestHandler extends Thread { 

    private Socket socket; 

    RequestHandler(Socket socket) { 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Client Request Response being processed..."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      PrintWriter out = new PrintWriter(socket.getOutputStream()); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

しかし、制御が最初のインスタンスのコンストラクタから復帰されていないとして、それは、唯一のインスタンスを作成します。制御を取り戻し、両方のサーバーソケットリスナを同時に実行する可能性はありますか? (ps:それが間違っている、または自明であれば私を許しなさい!)

答えて

1

あなたはSimpleSocketServerRunnableを実装する必要があります。コンストラクタ内のRunnableとしてスレッド自体を開始します。 run()メソッドでaccept()ループを実行します。現在、接続を待っているコンストラクタをブロックしており、サーバーも単一の接続しか処理しません。

さらに興味深いのは、同じサービスを2つのポートに提供する理由です。

+0

両方のポートで同じコードを実行しているときに、クライアントまたは通信の問題を特定することはできません。有能なプログラマーがこの答えをコードに変換できると私は期待しています。これは無料のコーディングサービスではありません。 – EJP

+0

同じリスニングソケット経由で複数の接続を受け入れることができるかどうか、私は不思議に思っています。どのようにすべてのTCPサーバーが動作するのか、そしてそれが私がacceptループを述べた理由です。 – EJP

0

2つの異なるポートをリッスンする2つの異なるスレッドを使用します。

Thread ServerThread1 = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     ServerSocket ServerSocketObject = null; 
     while(true) 
     { 
     try { 
      ServerSocketObject = new ServerSocket(Your_Port_Number1); 

       Socket SocketObject = ServerSocketObject.accept(); 
       // Your Code Here 
       SocketObject.close(); 

     } catch (IOException e) { 
       try { 
        ServerSocketObject.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      e.printStackTrace(); 
     } 
     } 
    } 
}); 

Thread ServerThread2 = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     ServerSocket ServerSocketObject = null; 
     while(true) 
     { 
     try { 
      ServerSocketObject = new ServerSocket(Your_Port_Number2); 

       Socket SocketObject = ServerSocketObject.accept(); 
       // Your Code Here 
       SocketObject.close(); 

     } catch (IOException e) { 
       try { 
        ServerSocketObject.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      e.printStackTrace(); 
     } 
     } 
    } 
}); 

ServerThread1.start(); 
ServerThread2.start(); 
+0

ここに2組のコードは必要ありません。 – EJP

+0

あなたは更新を提案することができます... –

+0

runnableを拡張し、コンストラクタを介してポート番号を渡すクラスを作成することはできますが、これはわかりますが、これは理解を容易にするためです。 –

関連する問題