ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 ネットワークプログラミング

ソケットクライアントを作る

Creating a Socket Client

ソケットサーバを作る
ポート5000と同期するソケットサーバを実行させました。
ここでは同期しているサーバに接続し、いくつかのデータを
送信するソケットクライアントを実行する方法を示します。
実際には、どのようにソケットクライアントを実行し、
とても説得力のあるアプリケーションを作れるようにしてくれると
知られています。
例えば、映画チケットを予約システムを構築したくて、
そこに映画のチケットを予約し、席をおさえたいユーザから
くる接続とソケットサーバを同期します。
ユーザが席をおさえた時には、他の接続されたすべてのユーザは
席がすでにおさえられていて、入手できないと説明する通知を
受け取ります。
これで、ユーザはいつも更新された映画の席の状態を見られます。
まず、以下のようなオブジェクトを作ります。

static final String SERVER_IP = "192.168.1.13";
static final int SERVER_PORT = 5000;
Handler handler = new Handler();
static Socket socket;
PrintWriter printWriter;

最初の2つのオブジェクトはIPアドレスとソケットサーバの
ポート番号をセットします。
ソケットサーバを作るを元にしてます。)
いつものように、Handlerオブジェクトは安全なスレッドのやり方で
ユーザインターフェースの更新に使われます。
Socketオブジェクトはソケットサーバに接続するのに使われます。
PrintWriterオブジェクトはOutputStreamオブジェクトを通じ
サーバにデータを書き込む便利なメソッドです。
ソケットサーバに接続するためには、Runnableインターフェースを
実行するClientThreadを作ります。

public class ClientThread implements Runnable{
  public void run(){
   try{
    InetAddress serverAddr = InerAddress.getByName(SERVER_IP);
    handler.post(new Runnable(){
     @override
     public void run(){
      textView1.setText(textView1.getText() + "Connecting to the server");
     }
    });

    socket = new Socket(serverAddr, SERVER_PORT);
    try{
     printWriter = new PrintWriter(new BufferedWriter(
      new OutputStreamWriter(socket.getOutputStream())), true);

     //---get an InputStream object to read from the server---
     BufferedReader br = new BufferedReader(
      new InputStreamReader(socket.getInputStream()));

     try{
      //---read all incoming data terminated with a \n char---
      String line = null;
      while((line = br.readLine()) != null){
       final String strReceived = line;

       handler.post(new Runnable(){
        @Override
        public void run(){
         textView1.setText(textView1.getText() + "\n" + strReceived);
        }
       }
      }

      //---disconnected from the server---
      handler.post(new Runnable(){
       @Override
       public void run(){
        textView1.setText(textView1.getText() + "\n" +
            "Client disconnected");
       }
      });

    }catch (Excedption e){
     final String error = e.gerLocalizedMessage();
     handler.post(new Runnable(){
      @Override
      public void run(){
       textView1.setText(textView1.getText() + "\n" + error);
      }
     });
    }

    }catch (Exception e){
     final String error ~ e.getLocalizedMessage();
     handler.post(new Runnable(){
      @Override
      public void run(){
       textView1.setText(textView1.getText() + "\n" + error);
      }
     });
    }

    handler.post(new Runnable(){
     @Override
     public void run(){
      textView1.setText(textView1.getText() + "/n" + "Connection Closed");
     }
    });

   }catch(Exception e){
    final String error = e.getLocalizedMessage();
    handler.post(new Runnable(){
     @Override
     public void run(){
      texxtView1.setText(textView1.getText() + "\n" + error);
     }
    });
   }
  }
}

ClientThreadクラスは以下のように動きます。
●Socketクラスを使ってソケットサーバに接続し、IPアドレスと
サーバのポート番号をソケットサーバに渡します。
●ソケットのInputStreamオブジェクトからBufferReaderオブジェクトを
作り、結果、サーバからのデータをBufferReaderオブジェクトが
読むことができます。
●ClientThreadクラスにデータを送信するのをサーバが
サーバが待っている間、無制限にループします。
ソケットサーバに接続するために、アクティビティのonStart()メソッド
にあるClientThreadをスタートできます。

@Override
protected void onStart(){
  super.onStart();
  Thread clientThread = new Thread(new ClientThread());
  clientThread.start();
}

アクティビティがバックグラウンドに回ったときには、
アクティビティのonStop()メソッドでサーバからの
接続を切ることができます。

@Override
protected void onStop(){
  super.onStop();
  try{
   socket.shutdownInput();
   socket.close();
  }catch(IOException e){
   e.printStackTrace();
  }
}

Socketオブジェクトのclose()メソッドを呼び出すことが
接続を切るのに十分でないことに注目します。
なぜなら開発者が分離したスレッドがサーバから入ってくるデータを
待っている間、無制限にループしているからで、close()メソッドを
呼び出すのではソケットの接続を切れません。
代わりに、SocketオブジェクトのshutdownInput()メソッドを
まず呼び出す必要があり、結果、shutdownInput()メソッドが
ソケットの入力ストリームを閉じることができます。
ソケットサーバにデータを送信するためには、
PrintWriterオブジェクトのprintInメソッドを使います。

public void onClick(View view){
  handler.post(new Runnable(){
   @Override
   public void run(){
    printWriter.printIn(editText1.getText().toString());
   }
  });
}

printIn()メソッドがソケットサーバに送信している文字列の最後に
改行文字("\n")を自動的に追加することに注目します。
他のAndroidデバイスでアプリケーションを展開します。
AVD、Androidエミュレータに展開することもできます。

ホーム
便利堂ロゴ
inserted by FC2 system