黒馬プログラマー-ネットワークプログラミング

11491 ワード

-----------------------androidトレーニング、javaトレーニング、交流を楽しみにしています!------------------------------
ネットワークプログラミングの本質は、異なるデバイス間のデータ伝送またはプログラムとプログラム間のデータ通信が要求応答モードに基づいていることである.
よくある2 B/SとC/S構造をまとめた
複数のデバイスまたはプログラムに関連するため、ipアドレスとポート番号を使用してデバイスとプログラムを位置決めする必要があります.
ipアドレスインターネット上で異なるデバイス間の通信を実現するためには、各デバイスにグローバル唯一のアドレスが必要です.このアドレスは、ipアドレスがネットワーク番号とホスト番号で構成され、人と所有している身分証明書です.
一つの道理ipアドレスの命名注意はipv 4プロトコルの長さ32 bitに従って、現在IPが不足してIPV 6プロトコルの長さ128 bitを発売するのに足りないためです.
ローカルループアドレス:127.0.0.1ホスト名:localhostは、ネイティブネットワークカードが壊れているかどうかをテストします.
sun社は、プログラミングで使用される多くのipアドレスの操作方法を、複雑な操作から簡単な操作によりよくカプセル化するために、InetAddressオブジェクトに抽象クラスを提供しています.
静的取得オブジェクトメソッドは、通常getByName(String str)メソッドで取得されます.
ポート番号:デバイス上で異なるネットワークプログラム間の通信を実現するために、各ネットワークプログラムには唯一のアドレスが割り当てられます.このアドレスはポート番号です.ホテルのナンバープレートのようなものです.
 
有効なポート番号0から65535 0から1024は、ウェブサービス80ポートDNSサービス53ポートなどのシステムプログラムに予約されたポート番号を保持するために使用される.
ネットワーク通信方式
TCP:Transfer Control Protocol:転送制御プロトコルは、接続向け、信頼性、安全な接続です.接続を確立する3回の握手を通じてUDP:User Datagram Protocol:ユーザーデータ報告プロトコルを完成し、非接続で、信頼性がなく、安全でないパケットサイズは64 k以内に制限する速度が速い
ソケット通信双方が従う約束はネットワーク通信の下層実装をカプセル化している.下層通信の原理を知る必要はない.ソケットプログラミングに直面するだけで、通信の両手のデータ交換を実現することができる.
複雑な下位原理の中で解脱して直接ソケットc/s構造のネットワークに向かってプログラミングするには、ソケットすなわち端点を明確にし、ペアで現れる必要がある.
ソケットは現実の埠頭に相当する
ネットワークプログラミングステップはすべての言語に適用されます
カスタマーサービス側のプログラミング手順
1.ネットワーク接続の確立
ネットワーク接続を確立する時、サーバーに接続するipアドレスとポート番号を指定する必要があり、確立に成功すると仮想リンクが形成され、その後の操作はこの接続を通じてデータ交換を行うことができる.
2.データ交換
交換データは厳格に要求応答モードに従って行って、客服側から1本の要求データをサーバーに送って、サーバーは1つの相応のデータを客服側にフィードバックして、もし客服側が要求サービス側を送らないならば
応答しない.論理的必要に応じてデータを複数回交換できますが、リクエスト応答モデルに従う必要があります.
3.ネットワーク接続を閉じる
データ交換が完了したら、ネットワーク接続をオフにし、プログラム専用のポート、メモリなどのシステムリソースを解放します.
サービス側プログラミング手順
1.サービス傍受ポートの作成
サーバ側はパッシブ待機接続に属するため、サーバ側が起動した後、接続を開始する必要はなく、ローカルコンピュータの固定ポートを傍受するだけでよい.このポートはサービス側が
クライアントのポート
2.接続の取得
クライアントがサービス側に接続されると、サービス側はクライアントの情報、例えばカスタマーサービス側のipアドレスポートなどを含み、サービス側とクライアントもこの接続によって行う接続を得ることができる.
データ交換.一般的に、サービス側プログラミングでは、接続を取得する際に、独立したスレッドによって実現される接続はなく、専用のスレッドを開いて処理する必要があります.
3.データ交換
サービス側は、取得した接続によってデータ交換を行う.サービス側のデータ交換手順は、まずクライアントから送信されたデータを受信し、論理処理を行い、処理後の結果データを
クライアント.簡単に言えば、クライアントの交換順序とは異なる送信を先に受け入れることです.
4.接続を閉じる
サーバプログラムがシャットダウンされると、サーバ側をシャットダウンし、サーバ側が傍受するポートと専用の内部を解放できるようにすることで、接続のシャットダウンを実現します.通常、サービス側は
クライアントのソケットサービス側のリソースを閉じて閉じません
実はサーバー側のプログラミングの模型とコールセンターの実現は類似していて、例えば中国移動の取引先の電話番号10086は典型的なコールセンターで、1人のユーザーが10086にダイヤルする時、1つの
一人の専門のカスタマーサービス人員は、そのカスタマーサービスによってそのユーザーの問題を解決し、もう一人のユーザーが10086に電話すると、もう一人のカスタマーサービスに転送し、問題の解決を順次類推する.
サーバー側でプログラミングする時、10086この電話番号はサーバー側のポート番号に似ていて、各ユーザーは1つのクライアントプログラムに相当して、各カスタマーサービス担当者はサービス側が起動した専門と
クライアント接続のスレッドは、各スレッドが独立してインタラクティブです.これがサーバプログラミングモデルであるが,TCP方式は接続を確立する必要があり,サーバ側に対する圧力は比較的大きいが,UDPは
接続を確立する必要がなく、サーバに対する圧力が比較的小さい
 
 
JAVAソケットプログラミング
tcp
サービス側
1.ServerSocketによるサービス傍受ポートの確立
2.サービス側を接続するカスタマーサービス側オブジェクト(Socket)のブロック方法を取得する
3.クライアントオブジェクトからIOストリームを取得する
4.顧客サービス側とデータ通信を行う
5.客服側ソケットを閉じる
6.サービス側の関係は状況によって異なる
複数のクライアントを同時に対応させる場合
1と2または1は一般的にループに配置され、ループにスレッドを作成してループを開始し、最後に6を配置します.2または3~5をスレッドにカプセル化ループに1と6しかない場合は、Server Socketをスレッドに転送します.
126ならカスタマーサービス側Socketオブジェクトをスレッドに転送します...チャットプログラムなどでは通常、入力ストリームと出力ストリームを2つのスレッドに入れて2つのテキストコンテナを操作して同時チャットを実現します.
 
udp
sendメソッドによるreceiveメソッド受信の送信
DatagramSocket udpプログラミングで使用されるソケットの送信、受信の単位はDatagramPacket
DatagramPacket UDPプログラミングでの送信と受信に使用されるユーザーデータパケットには、ipアドレスやポート番号パケット長データの取得と設定などの情報がカプセル化されています.ネットワークプログラミングをよりよく行うことができます.結局、このプロトコルはユーザーデータメッセージプロトコル送信受信と呼ばれています.それはデータメッセージに違いありません.
DatagramPacketにはget/setPortの操作があり、setはこのパッケージを設定する目的のポート番号であり、getには送信されていないときにさっきのsetのポート番号が得られる場合が2つあります.1つは、受信側で送信側のSocketのポート番号(送信側DatagramePacketの設定されたポート番号)を取得することである.従ってgetPortはPacketのPortを取得する方法であり、getLocalPortはSocketのPortを取得する方法である.
パラメータにbyteの配列データを入れて数字に入れてユーザーデータパケットを操作する方法は、実際にはその配列を操作するポインタです
ピアツーピアネットワークのエンドポイントはサービス側であり、カスタマーサービス側でもある.
一般的な手順で他のエンドポイントと接続データ通信を確立し、レベルを閉じます.
CSモードにすることもできます
サービス側
1.サービス傍受ポートの作成
2.receiveメソッドにより取得したデータをユーザパケットに転送するブロック方法
3.このパケットから相手のipアドレスポートや要求情報ユーザパケット長などの情報を取得する
4.処理要求情報はsendメソッドによりクライアントに応答情報を送信する.の
5.资源を闭锁するのはもちろん関系なくてもいいです结局はサービス端ですか?あるサービス端の年将はすべて関系しません
もちろん234をスレッドやループにカプセル化することもできます
234は実際に実行されるデータ通信である
 
クライアント
1.サービス側と練習レベルを確立する
2.sendメソッドによりデータパケットにカプセル化されたリクエスト情報を送信
3.功罪receive受信サーバの応答情報ブロック方法
4.リソースをオフにする
データ通信は複数回行われてもよいし、ループや独立したスレッドにおいて受信や送信が分離されてもよい
 
DEMO
UDP伝送の簡単なデータをテストする:
 package net;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 //    server   ,    client  
 public class TestUDP {
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         UDPClient udpClient = new UDPClient();
         Thread t1 = new Thread(udpClient);
         t1.start();
         UDPServerFunc();
     }
     static void UDPServerFunc(){
         try {

             //        
             DatagramSocket dsServer = new DatagramSocket(7777);
             System.out.println("Server DatagramSocket Port"+dsServer.getLocalPort());

             //                 
             byte[] buf = new byte[1024];

             //                   buf                           
             DatagramPacket dpServer = new DatagramPacket(buf, 0, buf.length);

             //                             io  
             dsServer.receive(dpServer);
             System.out.println(dpServer.getAddress().getHostAddress() + " :: "
                     + new String(dpServer.getData(),0,dpServer.getLength()));
             System.out.println("Server DatagramPacket Port"+dpServer.getPort());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }


 class UDPClient implements Runnable{
     @Override
     public void run() {
         try {

             //        
             DatagramSocket dsClient = new DatagramSocket(6666);
             System.out.println("Client DatagramSocket Port"+dsClient.getLocalPort());

             //        
             byte[] buf = "hello this is UDPTest".getBytes();
             DatagramPacket dpClient =
                     new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 7777);
             Thread.sleep(1000);
             System.out.println("Client : "+"wakeup");
             System.out.println("Client DatagramPacket Port"+dpClient.getPort());

             //                    IO  
             dsClient.send(dpClient);
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
 }


 
UDPには「方向」がないので、DatagramePacketでデータを送信したり、データを受信したりします.しかし、TCPは「方向」の接続があるため、クライアント側とサーバ側を2つのクラスSocket、ServerSocketでそれぞれ表し、TCPはまずSocketの「パス」を形成し、その後、IOストリームを介してこのパス上でデータの伝送を行う.すなわち、サーバSocketは、クライアントのSocketを受信した後、このSocketのIOストリームを呼び出してデータのストリーム転送を実現する.
 
package net;
  //     server      client
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.net.BindException;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.UnknownHostException; 


public class TestTCP {
     public static void main(String[] args){
         try {

              //        
             ServerSocket ssever = new ServerSocket(7777);
             System.out.println("ServerSocket Port:" + ssever.getLocalPort())

;
             Thread tclient = new Thread(new TCPClient());
             tclient.start();
             //       
             Socket s1 = ssever.accept();

             //      IO 
             InputStream serverIn = s1.getInputStream();
             OutputStream serverOut = s1.getOutputStream();
             System.out.println("Server : "+"connected host : "+"addr --"+s1.getInetAddress().getHostAddress()
                                     +";port --"+s1.getPort());
             BufferedReader serverBR = new BufferedReader(new InputStreamReader(serverIn));
             BufferedWriter serverBW = new BufferedWriter(new OutputStreamWriter(serverOut));
             System.out.println("ready");
 //          String serverStr ="aaaaaaaa";//     

              //      
             String serverStr = serverBR.readLine();
             while (true) {
                 if (serverStr.equalsIgnoreCase("over")) {
                     s1.close();
                     break;
                 }
                 System.out.println("Server receive string : " +serverStr);
                 Thread.sleep(500);

                  //    
                 serverBW.write(serverStr.toUpperCase());
                 serverBW.newLine();
                 serverBW.flush();

                //    
                 serverStr = serverBR.readLine();
             }
             
         } catch (Exception e) {
             System.out.println("main problem");
         }
     }
 }


 class TCPClient implements Runnable {
     @Override
     public void run() {
         try {
             Thread.sleep(1000)

              //        
             Socket sclient = new Socket("localhost", 7777);
             System.out.println("Client Socket Port"+sclient.getLocalPort());

             //                        
             BufferedReader consleBR = new BufferedReader(new InputStreamReader(System.in));
             BufferedWriter clientBW = new BufferedWriter(new OutputStreamWriter(sclient.getOutputStream()));
             BufferedReader clientBR = new BufferedReader(new InputStreamReader(sclient.getInputStream()));
             
             String consoleStr = consleBR.readLine();
             String receiveStr = null;

             //                    
             while(true){
                 if (consoleStr.equalsIgnoreCase("Over")) {
                     clientBW.write("over");
                     clientBW.newLine();
                     clientBW.flush();
                     break;
                 }
                 clientBW.write(consoleStr);
                 clientBW.newLine();

                 //     
                 clientBW.flush();
//               SOP.sop("console : "+consoleStr);
                 receiveStr = clientBR.readLine();
                 System.out.println("Client receive string : "+receiveStr);
                 consoleStr = consleBR.readLine();
             }

             //       
             clientBR.close();
             clientBW.close();
             consleBR.close();
             
         } catch (UnknownHostException e) {
             System.out.println("UnknownHostException ...");
         } catch (InterruptedException e1) {
             System.out.println("InterruptedException ...");
         }catch (BindException e2) {
             System.out.println("BindException ...");
         }catch (IOException e) {
             System.out.println("IOEcxeption ... ");
         }
     }
 
}



-----------------------androidトレーニング、javaトレーニング、交流を楽しみにしています!------------------------------詳細は以下を参照してください.http://edu.csdn.net/heima