Java Socketプログラミング(二)


クライアントコードは、クライアントのキーボード入力を受け入れ、その情報を出力し、終了IDとして「End」を出力します.このプログラムは単純な2台のコンピュータ間の通信にすぎない.複数のお客様が同時に1つのサーバにアクセスしている場合は?クライアントをもう1つ実行してみると、異常が放出されます.では、複数のクライアントはどのように実現しますか?
実は、簡単に分析すると、お客様とサービス通信の主な通路がSocketそのものであることがわかります.サーバはacceptメソッドを通じて顧客との通信を確立することに同意します.これにより、お客様がSocketを構築すると同時に、サーバもこの接続線を使用して前後して通信します.それなら、私たちが複数の接続線を持っていればいいのです.では、私たちのプログラムは次のようになります.
サーバ:
import Java.io.*;
import Java.net.*;

public class MyServer 
{
 public static void 
 main(String[] args) 
 throws IOException
 {
  ServerSocket server=new 
  ServerSocket(5678);
while(true)
{
  Socket client=server.accept();
BufferedReader in=new BufferedReader(new 
InputStreamReader(client.getInputStream()));
PrintWriter out=new
PrintWriter(client.getOutputStream());
while(true)
{
 String str=in.readLine();
System.out.println(str);
 out.println("has receive...");
 out.flush();
 if(str.equals("end"))
 break;
}
client。close();
}
 } 
}

 ここでは外層のWhileサイクルを追加しただけです.このサイクルの目的は、クライアントが入ってくると、サーバとのインタラクションが完了するまでSocketを割り当てることです.ここでは、クライアントの「End」メッセージを受信します.では、マルチクライアント間のインタラクションを実現します.
しかし問題はまた来て、このようにして多くの取引先を解決しましたが、しかし列に並んで実行しました.つまり、あるクライアントとサーバが通信を完了した後、次のクライアントがサーバと対話することができます.同時サービスができません.では、どのようにしてお互いに交流し、同時に交流できるようにすることができますか?これは並列実行の問題であることは明らかです.だからスレッドは最高の解決策です.
では、次の問題はスレッドの使用方法です.まず最初にしなければならないことは、スレッドを作成し、ネットワークと接続できるようにすることです.その後、スレッドによってさっきの操作が実行されます.スレッドを作成するにはThreadを直接継承するかRunnableインタフェースを実装するか、Socketとの連絡を確立するには参照を渡すだけです.
スレッドを実行するにはrunメソッドを書き換える必要があります.runメソッドがやったこと.さっきのシングルスレッドバージョンmainのことです.私たちのプログラムはこうなりました
import Java.net.*;
import Java.io.*;

public class MultiUser extends Thread
{
 private Socket client;
 
 public MultiUser(Socket c)
 {
  this。client=c;
 }
 
 public void run()
 {
  try
  {   
   BufferedReader in=new BufferedReader(new 
   InputStreamReader(client.getInputStream()));
   PrintWriter out=new
   PrintWriter(client.getOutputStream());
    //Mutil User but can't parallel
    while(true)
	{
     String str=in.readLine();
     System。out.println(str);
     out.println("has receive...");
     out.flush();
     if(str.equals("end"))
      break;
    }
   client.close();  
   }catch(IOException ex)
   {
   }finally
   {
    
   }
 }
 
 public static void 
 main(String[] args)throws IOException
 {
  ServerSocket 
  server=new ServerSocket(5678);
  while(true)
  {
   //transfer location 
   change Single User or Multi User
   MultiUser mu=new MultiUser(server.accept());
   mu.start();
  }
 }
}

  私のクラスは直接Threadクラスから継承されました.また、コンストラクション関数を介してリファレンスを渡し、お客様のSocketと連絡を取りました.これにより、各スレッドに通信パイプがあります.同様にrunメソッドを記入することができます.前の操作をスレッドに渡して完了します.これにより、複数の顧客が並列したSocketが構築されます.