0

わかりました、私の友人が Java のネットワーキングについて教えてくれました。私たちは成功したプログラムを持っています。パテでつなぐのは簡単なおしゃべりですが、1つ問題があります。一度に接続できるクライアントは 1 つだけです。一度により多くのクライアントを接続する方法と、接続するクライアントの数を制限する方法を教えてください。

public class Base 
{
  static ServerSocket serverSocket;
  public static void main(String[] args) throws IOException
  {
    final ServerSocket serverSocket = new ServerSocket (1337);
    Thread thread = new Thread(new Runnable()
                                 {
      public void run()
      {
        try
        {
          System.out.println("Waiting for connections...");
          //Make Socket on port
          Socket client = serverSocket.accept();
          System.out.println("Connection from " + client.getInetAddress());
          //initialixe no socket with connect server gets
          BufferedReader in = new BufferedReader (new InputStreamReader(client.getInputStream()));
          //init new beffer to read incom
          //while loop to read stuff
          final BufferedWriter out = new BufferedWriter(new PrintWriter(client.getOutputStream()));
          out.write("Your Connected Mate");
          out.newLine();
          out.flush();
          new Thread(new Runnable()
                       {
            public void run()
            {
              try
              {
                Scanner s = new Scanner(System.in);
                while(s.hasNext())
                {
                  out.write("CLIENT] " + s.nextLine());
                  out.newLine();
                  out.flush();
                }
              }
              catch(Exception e)
              {
                e.printStackTrace();
              }
            }
          }).start();
          while(true)
          {
            //make a string form anything thats read from the socket
            String tmp = in.readLine();
            //if the string isnt null (which it is if we disconnect) print it out
            if(tmp != null)
            {
              System.out.println("[CLIENT -> SERVER] " + tmp);
            }
          }
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }
    });
    thread.run();
  }
}

わからないので、何も試していません:)

4

2 に答える 2

0

クライアント(既存のスレッド内)で接続を受け入れるために、while(true)ループ(while(notInterrupted)または何か)を配置する必要があると思います。run接続を長時間維持する場合は、それらを処理するスレッドを生成する必要があると思います (単純な Web サーバーなどのユース ケースでは、おそらくスレッドを生成する必要はありません。各クライアントが使用する時間は、おそらくスレッドを生成することによって使用される時間よりも少なくなります)。

いくつかのサンプル サーバーを調べて、それらをニーズに適合させることができるかどうかを確認してください。

接続できるクライアントの数を制限することに関しては、スレッドのプールを処理し、1 つが解放されたときに 1 つだけを提供する、ある種のブロッキング データ構造が必要になるでしょう。スレッドプールが思い浮かびます...

于 2013-01-30T23:49:24.130 に答える
0

最初のステートメントのすべてを while ループで囲みます。このtryループは、別のクライアントに接続するまで繰り返されます。次にin.readLine()、サーバーの出力 ( out.write()).

すべてのクライアントには、独自の入力スレッドと出力スレッドが必要です。サーバーが引き続き接続を受け入れることができるように、クライアントとサーバー間の通信をメイン スレッドから切り離すようにしてください。

コード例:

//Setup your ServerSocket

ServerSocket server = new ServerSocket();

while (true){
    Socket s = server.accept();
    Thread input = new Thread(new Runnable(){
            //Set up your BufferedReader or whatever input method you are using here
                      BufferedReader in = new BufferedReader (new InputStreamReader(client.getInputStream()));

            while(true)
            {
            //make a string form anything thats read from the socket
            String tmp = in.readLine();
            //if the string isnt null (which it is if we disconnect) print it out
            if(tmp != null)
            {
              System.out.println("[CLIENT -> SERVER] " + tmp);
            }
          }
        }).start();

    //Do the same for your output as you just did for your input (make a new thread, make a new writer object, etc.)
}
}

注: これは非常に大まかな例です。いくつかの空白と、おそらくいくつかの {} を埋める必要があり ます。これがお役に立てば幸いです!

于 2013-01-30T23:49:57.660 に答える