2016-04-26 4 views
-2

どのように入力されたソケットを受け入れ、キューに入れるよりも、(それぞれのスレッドにスレッドを設定することなく)サーバーを作ることができますか?ここJavaでスレッドを設定せずにソケットを受け入れる方法は?

(ここではあなたがソケットごとにスレッドを作成して、私は、私は受け入れる各ソケットは、ソケットごとにスレッドを作成せずに、キューに入ることしたい)定期的なマルチスレッドのコードです:

public class MultiThreadedServer implements Runnable{ 

    int   serverPort = 10000; 
    ServerSocket serverSocket = null; 

    public MultiThreadedServer(int port){ 
     this.serverPort = port; 
    } 

    public void run(){ 

     try { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     } catch (IOException e) { 
      throw new RuntimeException("Cannot open port 10000", e); 
     } 
     while(true){ 
      Socket clientSocket = null; 
      try { 
       clientSocket = this.serverSocket.accept(); 
      } catch (IOException e) { 
       throw new RuntimeException(
        "Error accepting client connection", e); 
      } 
      new Thread(new WorkerRunnable(clientSocket, "Multithreaded Server")).start(); 
     } 
    } 

ありがとうございます

+1

'スレッド'を作成する部分を参照してください。ソケットをキューに入れる部分に置き換えます。 – Kayaman

+0

Java NIOを試してください。ここでは、多重化(および非ブロック化)ioを実行できます。 https://en.wikipedia.org/wiki/Non-blocking_I/O_%28Java%29 –

+0

@ Kayaman、新しいスレッドの作成は、ソケットの受け入れと同時に起こっていますか? ソケット要求が到着したときにスレッドを作成するとどうなりますか? – adi

答えて

0

私はあなたの質問を正しく理解する場合、このコードは、あなたが欲しいものを達成するはずです。

public class MultiThreadedServer implements Runnable 
{ 

    int serverPort = 10000; 
    ServerSocket serverSocket = null; 

    ArrayList<Socket> socketQueue; //ArrayList to be used as a queue 

    public MultiThreadedServer(int port) 
    { 
     this.serverPort = port; 

     socketQueue = new ArrayList<>(); //Initialize your ArrayList 
    } 

    public void run() 
    { 
     try 
     { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     } 

     catch (IOException e) 
     { 
      throw new RuntimeException("Cannot open port 10000", e); 
     } 

     while(true) 
     { 
      Socket clientSocket = null; 

      try 
      { 
       clientSocket = this.serverSocket.accept(); 
      } 

      catch (IOException e) 
      { 
       throw new RuntimeException("Error accepting client connection", e); 
      } 

      socketQueue.add(clientSocket); //Add your newly accepted socket to ArrayList 
      //new Thread(new WorkerRunnable(clientSocket, "Multithreaded Server")).start(); 
     } 
    } 
} 

新しい接続が承認されるたびに、socketQueue(ArrayList)に追加されます。

関連する問題