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サービス:
TCPクライアント:
TCPプログラミングでは、メッセージを送信するタイミングの問題に注意しなければなりません.getInputStreamは現在のスレッドを保留させます.タイミングを間違えると、両側がgetInputStreamになって、あなたが待っているようになります.私はあなたを待っています.両側が譲らないので、誰も実行できません.もう一つは、サービス側がクライアントメッセージを受信するとき、buffer.readLineメソッドは、1行の情報を読み取るので、この行の「」という文字は少なくありません.「」が少なければreadLineは終了メッセージを受信できず、このローは永遠に読み切れないことになります.実はこの「」の思想は、ここでは文字列に関する簡単なアプリケーション層プロトコルとして理解することができます.
UDPクライアント:
UDPクライアント:
最後に、アプリケーション層プロトコルの小さなケースであるHttpClientを挙げます.主な手順と実装コードは次のとおりです.必要なjarパッケージのインポート commons-codec-1.9.jar commons-logging-1.2.jar httpclient-4.5.3.jar httpcore-4.4.6.jar
HttpClientオブジェクトを作成する 要求オブジェクト を作成する.応答オブジェクト を処理する.
結局、このケースは下層プロトコルをパッケージ化しており、HTTPプロトコルはTCPプロトコルの上に構築されているので、下層はこれらのSocketプログラミングから逃れられない.
ネットワークプログラミングの基礎はここまでで、次の章ではHTTPプロトコルの内容を詳しく学びます.
このモジュールでは主にWebバックエンドの開発を学び、JavaEEのコアコンテンツには多くのコンテンツが含まれており、7つの章に分けて学習しています.
01ネットワークプログラミングの基礎
Web開発とネットワークプログラミング
ネットワーク7層モデル
長い発展を経て、インターネットは次第に通信の主な力となり、伝統的な通信業務のように、人々はインターネットを利用して信頼できる通信を行うモデルを構築した.OSI 7層モデルになる:
OSI 7層モデル
郵便物システム
第7層:アプリケーション層は端末の情報交換を実現する.
メッセージの内容を読み込みます.
第六層:暗号化、復号化、圧縮など、層情報解釈の前段操作を表す.
手紙が届いたので,封筒を開けた.
第五層:セッション層はアプリケーションプロセス間で約束された原則に従い、正しい順序でデータを送受信し、様々な形態の会話を行う.
手紙が届いたので、宅配便のお兄さんは送り物の手配を始め、受取人にどのように受け取りますかと連絡しました.
第4層:伝送層端開放システム間のデータ伝送制御層.主な機能はエンドオープンシステム間のデータの受信確認である.
輸送方式、空輸、陸運、蒸気輸送などを選択します.
第3層:ネットワーク層はサブネットの運行を制御し、例えば論理アドレス、パケット伝送、ルーティング.
集散センターに送り、伝達経路を計画する.
第2層:データリンク層物理アドレス、データリンクの確立、取り外し、データの誤り検出、誤り訂正はデータリンク層の基本的な任務である.
サイトはピックアップして、住所が記入されているかどうか、届くかどうかをチェックします.
第1層:物理層は、物理的接続の確立、保持、および切断のための機械的、電気的、機能的およびプロセスの条件を提供する.
各配達と受信サイトを確立し,物理伝送ネットワークを形成する.
つうしんプロトコル
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を挙げます.主な手順と実装コードは次のとおりです.
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プロトコルの内容を詳しく学びます.