2016-09-03 14 views
1

私は単純なクライアントサーバーアプリケーションを作っています。どのクライアントでシャットダウンを送信するか、サーバーにコマンドを再起動します。しかし、クライアントの次のcommand.Meansソケットのためにサーバーソケットを保持する方法は、一度コマンドを受け付けています。その後、そのサーバーは他のコマンドを受け入れていません。クライアントが「再起動」を送信すると、サーバは指定された時間だけコマンドを実行し、クライアントが「中断」コマンドを送信した場合は中止する必要があります。サーバーソケットはクライアントの次のコマンドを待つ必要があります。Java

どのようにサーバーのソケットを次のコマンドを待つことができますか?ここで

は、サーバーのコードです:

running = true; 
    try { 
     System.out.println("Waiting for client........"); 
     ServerSocket serverSocket = new ServerSocket(8002); 
     Socket client = serverSocket.accept(); 
     System.out.println("Connection Accepted......"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     try { 
      while (running) { 
       String usercmnd = in.readLine(); 
       if (usercmnd != null) { 
        Runtime runtime = Runtime.getRuntime(); 
        Process p = runtime.exec(usercmnd); 
        //serverSocket.setSoTimeout(30000); 
       } 
      } 

     } catch (Exception e) { 
      System.out.println("Error"); 
      e.printStackTrace(); 
     }finally{ 
     client.close(); 
     System.out.println("Connection Closed......"); 
     } 
    } catch (Exception e) { 
     System.out.println("Error"); 
     e.printStackTrace(); 
    } 

ここでは、クライアントコード

restart.setOnClickListener(
      new View.OnClickListener() { 
       public String rest = "shutdown -r -t 30"; 
       @Override 
       public void onClick(View v) { 
        Socket cs = null; 
        try{ 
         cs = new Socket("192.168.20.128",8002); 
         DataOutputStream out = new DataOutputStream(cs.getOutputStream()); 
         out.writeBytes(rest); 
         Toast.makeText(PowerActivity.this, "Restart Success", Toast.LENGTH_LONG).show(); 

        } 
        catch (IOException e) { 
         Toast.makeText(PowerActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
        }finally { 
         try { 
          cs.close(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
    ); 
+0

複数の接続を受け入れるために、 '' socket client = serverSocket.accept(); ''をループに入れてください。 – f1sh

+0

あなたは私があなたに与えた、待ってくれました。私は助けようとしていました。私の担当者をコメントしません。@nilesh kumar – khakishoiab

+0

うん!その仕事.. !! @ f1sh –

答えて

1

しかし、どのように ソケットが一度用のコマンドを受け付けて、クライアントの次のcommand.Meansのサーバソケットを保持することです。そのサーバーの後に他のコマンドを受け入れるのは ではありません。

どのようにコマンドをサーバーに送信しているかによって異なります。あなたは同じボタンのクリックで、サーバにコマンドを送信する場合は

  1. は、その後、私は、サーバーにクライアントから送信されている他のメッセージを見つけることができません。一方、サーバーはwhileループでデータを待機しています。

  2. サーバーにコマンドを送信する場合は、各ボタンをクリックします。その場合、サーバーはsocket.accept()メソッドが1つしかないため、1つの接続のみを受け入れることができます。

このようにコマンドを送信する場合は、サーバーコードをwhile(true)ループ内にラップします。その場合

、サーバー・コードは次のようなものでなければなりません。この場合

try { 
    System.out.println("Waiting for client........"); 
    ServerSocket serverSocket = new ServerSocket(8002); 
    while(true){ 
    Socket client = serverSocket.accept(); 
    System.out.println("Connection Accepted......"); 
    ...// 
    } 

、あなたはin.readLine();は、ブロッキング呼び出しであるとして、あなたのソケットの入力ストリームを管理するためにスレッドを使用する必要があると思います。ここにも無限ループがあります。したがって、スレッドを使用し、ソケットオブジェクト(サーバーコードでclientと呼ぶ)をこのスレッドに渡し、残りの本体をスレッドの実行メソッド内にラップします。


注:ところで、私はあなたが与えてくれたコマンドごとのように、サーバーがシャットダウンしようとしていると思われます。そのような場合は、サーバがシャットダウンするので、それ以上通信することはできません。

そうでない場合は問題ありません。おそらく、その場合、私はあなたの質問のコマンドを誤解しました。

+1

うん!その作業今 –

+0

私はそれをやった:/ –

関連する問題