JavaWebコア技術学習ノート(一)——ネットワークプログラミング基礎

15823 ワード

シーケンス
このモジュールでは主にWebバックエンドの開発を学び、JavaEEのコアコンテンツには多くのコンテンツが含まれており、7つの章に分けて学習しています.
  • ネットワークプログラミングの基礎--(一)
  • Httpプロトコル--(二)
  • JavaEEシステム概要
  • サーバテクノロジ
  • サーブレット開発webアプリケーション
  • JSP開発webアプリケーション
  • 統合開発
  • 最初の3つの章は理論性が強いが、もし私たちがこれをマスターしたいなら、拳を出したいなら、馬の足がしっかりしているのは必然だ.私は主に理解しなければならない知識点を羅列して、私のこのシリーズのブログを見た仲間たちがこの前の3章の知識を詳しく理解することができることを望んでいます.第4章から、Webアプリケーションの開発を実現するために本格的に着手しました.
    01ネットワークプログラミングの基礎
    Web開発とネットワークプログラミング
  • webの本意はクモの巣と網の意味で、ウェブデザインではウェブページと呼ばれています.現在、インターネット、インターネットなどの技術分野に広く翻訳されている.3つの形式で表現されています.
  • ハイパーテキスト(hypertext)
  • ハイパーメディア(hypermedia)
  • ハイパーテキスト転送プロトコル(HTTP)
  • web開発は、特定の条件下でのネットワークプログラミング
  • である.
  • C/SアーキテクチャとB/Sアーキテクチャ
  • web開発の目的と意義
  • 根本目的:エンドツーエンドの情報インタラクション(通信)
  • を実現する.
  • 特徴:B/Sアーキテクチャのために
  • を生み出す
  • 究極の目的:スーパーAPP

  • ネットワーク7層モデル
    長い発展を経て、インターネットは次第に通信の主な力となり、伝統的な通信業務のように、人々はインターネットを利用して信頼できる通信を行うモデルを構築した.OSI 7層モデルになる:
    OSI 7層モデル
    郵便物システム
    第7層:アプリケーション層は端末の情報交換を実現する.
    メッセージの内容を読み込みます.
    第六層:暗号化、復号化、圧縮など、層情報解釈の前段操作を表す.
    手紙が届いたので,封筒を開けた.
    第五層:セッション層はアプリケーションプロセス間で約束された原則に従い、正しい順序でデータを送受信し、様々な形態の会話を行う.
    手紙が届いたので、宅配便のお兄さんは送り物の手配を始め、受取人にどのように受け取りますかと連絡しました.
    第4層:伝送層端開放システム間のデータ伝送制御層.主な機能はエンドオープンシステム間のデータの受信確認である.
    輸送方式、空輸、陸運、蒸気輸送などを選択します.
    第3層:ネットワーク層はサブネットの運行を制御し、例えば論理アドレス、パケット伝送、ルーティング.
    集散センターに送り、伝達経路を計画する.
    第2層:データリンク層物理アドレス、データリンクの確立、取り外し、データの誤り検出、誤り訂正はデータリンク層の基本的な任務である.
    サイトはピックアップして、住所が記入されているかどうか、届くかどうかをチェックします.
    第1層:物理層は、物理的接続の確立、保持、および切断のための機械的、電気的、機能的およびプロセスの条件を提供する.
    各配達と受信サイトを確立し,物理伝送ネットワークを形成する.
    つうしんプロトコル
  • 物理層:
  • イーサネット、モデム、電力線通信(PLC)、SONET/SDH、G.709、光ファイバ、同軸ケーブル、ツイストワイヤなど.
  • データリンク層:
  • Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16)、ARP、RARP、ATM、DTM、トークンリング、イーサネット、FDDI、フレーム中継、GPRS、EVDO、HSPA、HDLC、PPP、L 2 TP、PPTP、ISDN、STPなど.
  • ネットワーク層プロトコル:
  • IP(IPv 4、IPv 6)、ICMP、ICMPv 6、IGMP、IS-IS、IPsecなど.
  • トランスポート層プロトコル:
  • TCP,UDP,TLS,DCCP,SCTP,RSVP,OSPFなど.

  • アプリケーション層プロトコル:
  • DHCP、DNS、FTP、Gopher、HTTP、IMAP 4、IRC、NNTP、XMPP、POP 3、SIP、SMTP、SNMP、SSH、TELNET、RPC、RTCP、RTSP、SDP、SOAP、GTP、STUN、NTP、SSDP、BGP、RIP、ED 2 Kなど.


  • 2つの簡単な例を挙げて、TCPプログラミングとUDPプログラミングの2つの典型的なトランスポート層プロトコルのプログラミングを振り返ってみましょう.
    TCPサービス:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * TCP     ,    ,      ,             (     )
    * : , * @author * */
    public class TCPServer { // ServerSocekt, private ServerSocket serverSocket; public static final int port = 8899; public TCPServer() { try { serverSocket = new ServerSocket(port); System.out.println(" " + port + " !"); } catch (IOException e) { e.printStackTrace(); } } /** * */ public void handleMsg() { // Socket Socket socket; OutputStream outputStream; try { System.out.println(" ..."); socket = serverSocket.accept(); System.out.println(" !"); // InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println(bufferedReader.readLine()); // outputStream = socket.getOutputStream(); outputStream.write("hello".getBytes()); outputStream.flush(); outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { TCPServer myServer = new TCPServer(); myServer.handleMsg(); } }

    TCPクライアント:
    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.Socket;
    
    /**
     * TCP     
     * @author   
     *
     */
    public class TCPClient {
        public static final String IP = "127.0.0.1";
        public static final int port = 8899;
        private Socket socket;
    
        public TCPClient() {
            try {
                socket = new Socket(IP, port);
                System.out.println("       !");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void handleMsg() {
            InputStream inputStream;
            OutputStream outputStream;
            try {
                //        
                outputStream = socket.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
                bufferedWriter.write("     !" + "
    "
    ); bufferedWriter.flush(); // inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println(bufferedReader.readLine()); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { TCPClient myClient = new TCPClient(); myClient.handleMsg(); } }

    TCPプログラミングでは、メッセージを送信するタイミングの問題に注意しなければなりません.getInputStreamは現在のスレッドを保留させます.タイミングを間違えると、両側がgetInputStreamになって、あなたが待っているようになります.私はあなたを待っています.両側が譲らないので、誰も実行できません.もう一つは、サービス側がクライアントメッセージを受信するとき、buffer.readLineメソッドは、1行の情報を読み取るので、この行の「」という文字は少なくありません.「」が少なければreadLineは終了メッセージを受信できず、このローは永遠に読み切れないことになります.実はこの「」の思想は、ここでは文字列に関する簡単なアプリケーション層プロトコルとして理解することができます.
    UDPクライアント:
    /**
     * UDP     ,     ,        (    )
     * @author   
     *
     */
    public class UDPServer {
        @SuppressWarnings("resource")
        public static void main(String[] args) throws IOException {
            DatagramSocket socket = new DatagramSocket(12345);
            while (true) {
                byte data[] = new byte[1024];
                //      DatagramPacket  
                DatagramPacket packet = new DatagramPacket(data, data.length);
                //  receive             ,           ,         
                socket.receive(packet);
                String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
                System.out.println("result ---> " + result);
            }
        }
    }

    UDPクライアント:
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * UDP   
     * @author   
     *
     */
    public class UDPClient {
        @SuppressWarnings("resource")
        public static void main(String[] args) {
            try {
                //      DatagramSocket  
                DatagramSocket socket = new DatagramSocket();
                //    InetAddress
                InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
                String str = "hello"; //       
                byte data[] = str.getBytes(); //          
                //    DatagramPacket  ,                            
                DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 12345);
                //  socket   send  ,    
                socket.send(packet);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    最後に、アプリケーション層プロトコルの小さなケースであるHttpClientを挙げます.主な手順と実装コードは次のとおりです.
  • 必要なjarパッケージのインポート
  • commons-codec-1.9.jar
  • commons-logging-1.2.jar
  • httpclient-4.5.3.jar
  • httpcore-4.4.6.jar

  • HttpClientオブジェクトを作成する
  • 要求オブジェクト
  • を作成する.
  • 応答オブジェクト
  • を処理する.
    import java.io.IOException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    public class HTTP {
        public static void main(String[] args) {  
            //  HttpClient  
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            //  Http    
            HttpPost httpPost = new HttpPost("http://www.baidu.com");
    
            //      
            try {
                //      
                CloseableHttpResponse response = httpClient.execute(httpPost);
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    結局、このケースは下層プロトコルをパッケージ化しており、HTTPプロトコルはTCPプロトコルの上に構築されているので、下層はこれらのSocketプログラミングから逃れられない.
    ネットワークプログラミングの基礎はここまでで、次の章ではHTTPプロトコルの内容を詳しく学びます.