Androidネットワーク通信----1.Socketプログラミングのシンプルクライアントとサーバ側通信


Androidネットワーク通信----1.Socketプログラミングのシンプルクライアントとサーバ側通信
このセクションの本文:
socketは通常、クライアントとサービス側の接続を実現するために使用され、socketはTcp/IPプロトコルの非常に流行しているプログラミングインターフェースであり、1つのsocketは1つのIpアドレスと1つのポート番号によって一意に決定される.しかし,socketがサポートするプロトコルの種類はTcp/IPだけではないため,両者には必然的な関連はない.Java環境において、socketプログラミングは主にTcp/IPプロトコルに基づくネットワークプログラミングである.
1.Socket通信プロセス
サーバ側は、あるポートに接続要求があるかどうかを傍受し、Client側はサービス側に接続要求を送信し、サービス側はクライアントに受信情報を返信する.1つの接続が確立され、サービス側とクライアントは読み書き操作で相手と通信することができます.
1)まずサービス側はserversocketを作成し、あるポートにクライアントの接続要求があるかどうかを傍受する. 
2)クライアントはsocketオブジェクトを作成し、ipとポート番号を指定し、サービス側に接続要求を送信する.
3)サービス側は接続要求を傍受し、serversocketのaccept()メソッドによってsocketオブジェクトを返して接続を確立する.
4)サービス側とクライアントはsocketの入出力ストリームを利用する読み書き操作を行う.
5)socket.を閉じる
これはサーバ側のコードです.次のようになります.
public class ClientTest {
	public static void main(String[] args) {
		try {
			ServerSocket s = new ServerSocket(2536);   //    ServerSocket    2536
			Socket incoming = s.accept(); //             ,        socket
			System.out.println("incoming come ");

			BufferedReader in = new BufferedReader(new InputStreamReader(
					incoming.getInputStream()));  //  socket     
			PrintWriter out = new PrintWriter(incoming.getOutputStream(), true); //  socket     
			out.println("Hello! Enter BYE to exit.");//         

			boolean done = false;
			Scanner scanner = new Scanner(System.in); //     
			System.out.println("***********begin************");

			while (!done) {
				String line = in.readLine();  //       
				System.out.println("  :" + line);
				String str = scanner.next();
				if (line == null) {
					done = true;
				} else {
					out.println(str); //        
					if (line.trim().equals("BYE")) {
						done = true;
					}
				}
			}
			incoming.close();
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

クライアント・コード:
public class Client {
	     public static void main(String args[]) {
	         try {  
	             Socket connection= new Socket("192.168.126.68", 2536);  
	             BufferedReader input = new BufferedReader(new InputStreamReader(
	                     connection.getInputStream()));

	             PrintWriter out = new PrintWriter(connection.getOutputStream(),true );
	             String info;
	             Scanner ss=new Scanner(System.in);
	    
	             while (true) {
	            	  info = input.readLine();
		          System.out.println("  : "+info);
		              
	            	 String str=ss.next();
	                 out.println(str);
	                 System.out.println("  :"+str);
	             }
	             connection.close();
	         }
	         catch (SecurityException e) {
	             System.out.println("SecurityException when connecting Server!");
	         }
	         catch (IOException e) {
	             System.out.println("IOException when connecting Server!");
	         }
	     }
}

よく問題にぶつかる
1).サービス側は1つのクライアント要求を受け入れるだけでなく,複数のクライアント要求を絶えず受け入れるが,どのように処理するか.
 サーバソケットを繰り返し呼び出すacceptメソッドを利用して、
ServerSocket ss=new ServerSocket(3000);  
while(true){
  Socket s= ss.accept(); //         ,         socket
}
).サービス側がクライアントデータを絶えず読み取り、クライアントにデータを書き込む必要がある場合、クライアントはサービス側データを絶えず読み取り、スレッドのブロックを防止する必要があります.どのように処理しますか?
readLineメソッドを使用してデータを読み取る場合、そのメソッドが正常に戻る前にスレッドがブロックされている場合、プログラムは実行できないため、このサービス側はsocketごとにスレッドを個別に起動する必要があり、各スレッドはクライアントとの通信を担当する.同様にクライアント側もスレッドを個別に起動し、サービス側のデータを読み取る必要がある
 private ArrayList<Socket> socketlist=new ArrayList<Socket>();
 ServerSocket ss =new ServerSocket(30000);
 while(true){
  Socket s=ss.accept();
  socketlist.add(s);
  new Thread(new Serverxian(s)).start();
 }

###############################################
Androidでは、(1)TCP/IP用のSocket、Server Socket(2)UDP用のDatagramSocket、DatagramPackageのいくつかのネットワークプログラミングが行われています.ここで注意しなければならないのは、Androidデバイスが通常ハンドヘルド端末であることを考慮して、IPはすべてインターネットに従って割り当てられていることです.固定ではありません.そのため、開発も一般的なインターネットアプリケーションとは少し違います.(3)直接URL用のHttpURLConnection(4)GoogleはApache HTTPクライアントを統合しており,HTTPを用いたネットワークプログラミングが可能である.HTTPに対してGoogleはAppache Http coreとhttpclient 4バージョンを統合しているため、Androidはhttpclient 3.xシリーズをサポートしておらず、現在はMultipart(MIME)をサポートしていないため、httpmime.jarを自分で追加する必要があることに特に注意している.  (5)Webサービスを利用する.AndroidはjacksonのようなオープンソースパッケージでXmlrpcやJsonrpcをサポートしたり、Ksoap 2でWebserviceを実現したりすることができます    (6)Webビューコンポーネントを直接使用してWebページを表示する.WebViewに基づいて開発され、Googleはchrome-liteベースのWebブラウザを提供しており、直接インターネットでWebページを閲覧することができます.