1。概要
- Javaはインターネット上の言語であり、言語レベルからネットワークアプリケーションをサポートし、プログラマーは一般的なネットワークアプリケーションを簡単に開発できます。
- Javaが提供するネットワーククラスライブラリは、痛みのないネットワーク接続を実現できます。ネットワークの基本的な詳細は、Javaのネイティブインストールシステムに隠され、JVMによって制御されます。また、Javaはクロスプラットフォームのネットワークライブラリを実装しており、プログラマーは統合されたネットワークプログラミング環境に直面しています。
2.ネットワーク基盤
- コンピュータネットワーク:
地理的に異なる地域に分散しているコンピュータを、通信回線を使用して専用の外部機器と接続し、大規模で強力なネットワークシステムを形成します。これにより、多数のコンピュータが相互に情報を簡単に送信し、ハードウェア、ソフトウェア、データを共有できます。リソース。 - ネットワークプログラミングの目的:
ネットワークプロトコルを介して他のコンピュータとのデータ交換と通信を直接的または間接的に実現します。 - ネットワークプログラミングには2つの主な問題があり
ます。ネットワーク上の1つ以上のホストを正確に見つける方法と、ホスト上の特定のアプリケーションを見つける方法です。
ホストを見つけた後、データ送信を確実かつ効率的に実行する方法。
3.ネットワーク通信
- ネットワーク通信は、IPとポートによって決定される通信の両方の当事者のアドレスに基づいています。
- ネットワーク通信は、ネットワーク通信プロトコルに従う必要があります。
(1)OSI参照モデル:このモデルは理想的すぎて、インターネット上で広く宣伝することはできません。
(2)TCP / IP参照モデル(またはTCP / IPプロトコル):現在の国際標準。
3.1IPアドレス
IPアドレスは、インターネット上のコンピューターの一意のIDです。
ローカルループバックアドレス(hostAddress):127.0.0.1
ホスト名(hostName):localhost
IPアドレス分類方法1:IPV4およびIPV6
- IPV4:4バイト、40-255。約42億、30億が北米、4億がアジアにあります。2011年の初めに使い果たされました。192.168.0.1などのドット付き10進表記で表されます
- IPV6:128ビット(16バイト)、8つの符号なし整数として記述され、各整数は4つの16進数で表され、数値はコロン(:)で区切られます(例:3ffe:3201:1401:1280:c8ff:fe4d :)。 db39:1984
IPアドレス分類方法2:パブリックネットワークアドレス(ワールドワイドウェブで使用)とプライベートアドレス(ローカルエリアネットワークで使用)。
- 最初のアドレスはプライベートアドレスで、範囲は192.168.0.0〜192.168.255.255で、組織の内部使用のために特別に使用され
ます。機能:覚えにくい
3.2ポート
ポート番号は、コンピューター上で実行されているプロセス(プログラム)を識別します。プロセスごとにポート番号が異なり、16ビット整数0〜65535として定義されます。
ポート分類:
- 認識されるポート:0〜1023。事前定義されたサービス通信によって占有されます(例:HTTPはポート80を占有し、FTPはポート21を占有し、Telnetはポート23を占有します)
- 登録ポート:1024〜49151。ユーザープロセスまたはアプリケーションに割り当てられます。(例:Tomcatはポート8080を占有し、MySQLはポート3306を占有し、Oracleはポート1521を占有します)。
- 動的/プライベートポート:49152〜65535。
4. OSI7層
OSIの7つの層は、アプリケーション層、プレゼンテーション層、セッション層、トランスポート層、データリンク層、物理層、およびネットワーク層です。
-
アプリケーション層:アプリケーション層は、ネットワークによってユーザーに提供されるサービスウィンドウであり、主にユーザーのニーズをサポートするために使用されます。人々のニーズは異なり、アプリケーション層テクノロジー
はさまざまなアプリケーションサービスを提供します:電子メール(MHS )、ファイル転送(FTAM)、仮想端末(VT)、電子データ交換(EDI)など。
主なプロトコル:FTP(21)、SMTP(25)、DNS.HTTP(80) -
プレゼンテーション層:異なるコンピューターシステム構造が異なるデータ表現を使用するため、通信に共通の言語を提供して対話を容易にします。たとえば、IBMホストはEBCDICエンコーディングを使用し、ほとんどのPCはASCIIエンコーディングを使用します。
データ暗号化、データ圧縮などの他の機能 -
セッション層:提供されるサービスにより、アプリケーションはセッションを確立および維持し、セッションを同期できます。トランスポート
層:コンピューターがネットワークを介して2日間データを通信する場合、それはエンドツーエンドレベルであり、バッファリング効果があります。
プロトコル: TCP / UDP -
物理層:データセグメント機器がデータを送信するためのパスを提供します。データパスは、物理メディアまたは複数の物理メディアの接続にすることができます。
-
データリンク層:データチャネルとして理解でき、
MACアドレスは一意性を表します -
ネットワーク層:IP、IPメッセージ形式のデータ転送
5.ネットワークプロトコル
5.1 TCP / IP(伝送制御プロトコル)
- TCP / IPは、伝送制御プロトコル(TCP)とインターネット相互接続プロトコル(IP)の2つの主要なプロトコルにちなんで名付けられています。実際、TCP / IPは、機能が異なり、相互に関連する複数のプロトコルを含む一連のプロトコルです。
- IP(インターネットプロトコル)プロトコルは、ネットワーク層のメインプロトコルであり、ネットワーク間のデータ通信をサポートします。
- より実用的な観点から、TCP / IPプロトコルモデルは、効率的な4層システム構造、つまり、物理リンク層、IP層、トランスポート層、およびアプリケーション層を形成します。
- 再送信が可能で、パケット損失はありません。失われた場合、記録して再送信しますが、繰り返されることはなく、信頼性があります。
- 注文すると、注文は間違っていません。たとえば、123を送信すると、2が失われ、再送信されます。その後、132を受信する場合がありますが、表示されるのは123である必要があります。
- リンクの場合、接続に失敗するとデータは送信されません
- スリーウェイハンドシェイクにより、データのセキュリティを確保し、相互作用を確保できます
- 電話をかけるのと同じで、通れないとデータが伝わりません。
5.1.1ソケット
- ネットワークアプリケーションを開発するためのソケットの使用は長い間広く採用されており、事実上の標準になっています。
- ネットワーク上で一意に識別されたIPアドレスとポート番号のみを組み合わせて、一意に識別可能な識別子ソケットを形成できます。
- 通信の両端には、2台のマシン間の通信のエンドポイントであるソケットが必要です。
ネットワーク通信は、実際にはソケット間の通信です。- ソケットを使用すると、プログラムはネットワーク接続をストリームとして扱うことができ、データはIOを介して2つのソケット間で送信されます。
- 通常、通信を開始するアプリケーションはクライアントであり、通信要求を待機しているのはサーバーです。
ソケット分類:
- ストリームソケット:TCPを使用して信頼性の高いバイトストリームサービスを提供します
- データグラムソケット:UDPを使用して「ベストエフォート」データグラムサービスを提供します
5.1.2一般的な方法
Socketクラスの一般的に使用されるコンストラクター:
- public Socket(InetAddress address、int port)は、ストリームソケットを作成し、指定されたIPアドレスの指定されたポート番号に接続します。
- public Socket(String host、int port)は、ストリームソケットを作成し、指定されたホストの指定されたポート番号に接続します。
Socketクラスの一般的なメソッド:
- public InputStream getInputStream()は、このソケットの入力ストリームを返します。ネットワークメッセージの受信に使用できます
- public OutputStream getOutputStream()は、このソケットの出力ストリームを返します。ネットワークメッセージの送信に使用できます
- public InetAddress getInetAddress()このソケットが接続されているリモートIPアドレス。ソケットが接続されていない場合は、nullを返します。
- public InetAddress getLocalAddress()ソケットにバインドされたローカルアドレスを取得します。つまり、ローカルエンドのIPアドレス
- public int getPort()このソケットが接続されているリモートポート番号。ソケットがまだ接続されていない場合は、0が返されます。
- public int getLocalPort()このソケットがバインドされているローカルポートを返します。ソケットがバインドされていない場合は、-1が返されます。つまり、ローカルエンドのポート番号です。
- public void close()このソケットを閉じます。ソケットが閉じられた後は、将来のネットワーク接続で使用できなくなります(つまり、再接続または再バインドできなくなります)。新しいソケットオブジェクトを作成する必要があります。このソケットを閉じると、ソケットのInputStreamとOutputStreamも閉じます。
- public void shutdownInput()ソケットでshutdownInput()を呼び出してから、ソケット入力ストリームからコンテンツを読み取ると、ストリームはEOF(ファイルの終わり)を返します。つまり、このソケットからの入力ストリームでデータを受信することはできません。
- public void shutdownOutput()は、このソケットの出力ストリームを無効にします。TCPソケットの場合、以前に書き込まれたデータが送信され、その後にTCPの通常の接続終了シーケンスが続きます。ソケットでshutdownOutput()を呼び出してから、ソケット出力ストリームに書き込むと、ストリームはIOExceptionをスローします。つまり、このソケットの出力ストリームを介してデータを送信することはできません。
5.1.3サーバー
*サーバープログラムの作業プロセスには、次の4つの基本的な手順が含まれます。
(1)ServerSocket(int port)を呼び出す:サーバー側ソケットを作成し、指定されたポートにバインドします。クライアント要求を監視するために使用されます。
(2)accept()の呼び出し:接続要求をリッスンし、クライアントが接続を要求した場合は、接続を受け入れて通信ソケットオブジェクトを返します。
(3)SocketクラスオブジェクトのgetOutputStream()とgetInputStream()を呼び出します。出力ストリームと入力ストリームを取得し、ネットワークデータの送受信を開始します。
(4)ServerSocketオブジェクトとSocketオブジェクトを閉じます。クライアントアクセスが終了し、通信ソケットが閉じられます。
ServerSocketオブジェクトは、郵便局の窓口にいる営業担当者と同様に、ソケット接続を確立するためのクライアントの要求を待機する役割を果たします。つまり、サーバーは、ソケット接続を確立するためのクライアントの要求を待機するServerSocketオブジェクトを事前に確立する必要があります。
クライアントのソケット要求のいわゆる「受信」は、accept()メソッドがSocketオブジェクトを返すことです。
5.1.4クライアント
クライアントSocketの作業プロセスには、次の4つの基本的な手順が含まれます。
(1)Socketの作成:指定されたサーバーのIPアドレスまたはポート番号に従ってSocketクラスオブジェクトを作成します。サーバーが応答すると、クライアントからサーバーへの通信回線が確立されます。接続に失敗すると、例外が発生します。
(2)ソケットに接続された入出力ストリームを開きます。getInputStream()メソッドを使用して入力ストリームを取得し、getOutputStream()メソッドを使用して出力ストリームを取得し、データ送信を実行します。
(3)ソケットの読み取り/書き込み特定のプロトコルに従って:パス入力ストリームは、サーバーが行に入力した情報を読み取り(ただし、サーバーが行に入力した情報を読み取ることはできません)、出力ストリームを介してスレッドに情報を書き込みます。
(4)ソケットを閉じる:クライアントからサーバーへの接続を切断し、回線を解放します
クライアントプログラムはSocketクラスを使用してオブジェクトを作成でき、作成時にサーバーへの接続を自動的に開始します。
Socketのコンストラクターは次のとおりです。
-
Socket(String host、int port)throws UnknownHostException、IOException:サーバーへのTCP接続を開始します(ドメイン名はホストです。ポート番号はポートです)。成功した場合はSocketオブジェクトを作成し、それ以外の場合は例外をスローします。
-
ソケット(InetAddressアドレス、intポート)はIOExceptionをスローします:InetAddressオブジェクトによって表されるIPアドレスとポート番号ポートに基づいて接続を開始します。
クライアントがsocketAtClientオブジェクトを確立するプロセスは、サーバーにソケット接続要求を送信することです。
5.2 UDP
5.2.1概要
- 高速で信頼性が低い
- 接続なし。ショートメッセージを送信するのと同じです。受信できるかどうかに関係なく、とにかく送信されます。DatagramSocket
クラスとDatagramPacketクラスは、UDPプロトコルに基づいてネットワークプログラムを実装します。- UDPデータグラムは、データグラムソケットDatagramSocketを介して送受信されます。システムは、UDPデータグラムが宛先に安全に配信されることを保証せず、いつ到着するかを決定することもできません。
- DatagramPacketオブジェクトは、UDPデータグラムをカプセル化します。データグラムには、送信者のIPアドレスとポート番号、および受信者のIPアドレスとポート番号が含まれます。
- UDPプロトコルの各データグラムは完全なアドレス情報を提供するため、送信者と受信者の間に接続を確立する必要はありません。それは小包を送るようなものです。
5.2.2一般的な方法
DatagramSocketクラスの一般的なメソッド:
- public DatagramSocket(int port)は、データグラムソケットを作成し、ローカルホスト上の指定されたポートにバインドします。ソケットはワイルドカードアドレスにバインドされ、IPアドレスはカーネルによって選択されます。
- public DatagramSocket(int port、InetAddress laddr)は、データグラムソケットを作成し、指定されたローカルアドレスにバインドします。ローカルポートは0〜65535(両方を含む)である必要があります。IPアドレスが0.0.0.0の場合、ソケットはワイルドカードアドレスにバインドされ、IPアドレスはカーネルによって選択されます。
- public void close()このデータグラムソケットを閉じます。
- public void send(DatagramPacket p)は、このソケットからデータグラムパケットを送信します。DatagramPacketに含まれる情報は、送信されるデータ、その長さ、リモートホストのIPアドレス、およびリモートホストのポート番号を示します。
- public void receive(DatagramPacket p)このソケットからデータグラムパケットを受信します。このメソッドが戻ると、DatagramPacketのバッファーは受信したデータでいっぱいになります。データグラムパケットには、送信者のIPアドレスと送信者のマシンのポート番号も含まれています。このメソッドは、データグラムが受信されるまでブロックします。データグラムパケットオブジェクトの長さフィールドには、受信した情報の長さが含まれます。情報がパケットの長さよりも長い場合、情報は切り捨てられます。
- public InetAddress getLocalAddress()ソケットにバインドされたローカルアドレスを取得します。
- public int getLocalPort()は、このソケットがバインドされているローカルホストのポート番号を返します。
- public InetAddress getInetAddress()は、このソケット接続のアドレスを返します。ソケットが接続されていない場合、nullが返されます。
- public int getPort()は、このソケットのポートを返します。ソケットが接続されていない場合は、-1が返されます。
DatagramPacketクラスの一般的なメソッド
- public DatagramPacket(byte [] buf、int length)
は、長さlengthのデータパケットを受信するためにDatagramPacketを構築します。長さパラメーターはbuf.length以下である必要があります。 - public DatagramPacket(byte [] buf、int length、InetAddress address、int port)は、指定されたホスト上の指定されたポート番号に長さの長さのパケットを送信するために使用されるデータグラムパケットを作成します。長さパラメーターはbuf.length以下である必要があります。
- public InetAddress getAddress()は、このデータグラムが送信
または受信されるマシンのIPアドレスを返します。 - public int getPort()は、リモートホストのポート番号を返します。このデータグラムは、ホストとの間で送受信されます。
- public byte [] getData()はデータバッファを返します。受信または送信されるデータは
、バッファ内のオフセットオフセットから始まり、長さの長さまで続きます。 - public int getLength()は、送信または受信するデータの長さを返します。
5.2.3サーバー
1.DatagramSocketとDatagramPacket2
。送信者と受信者を確立し
ます3.データパケットを作成します
4.
ソケットの送信メソッドと受信メソッドを呼び出します5.ソケットを閉じます
送信者と受信者は2つの独立した実行中のプログラムです
public static void main(String[] args) throws Exception {
// 打开UDP对象
DatagramSocket ds = new DatagramSocket(10000);
// 声明字节数组,用来存放收到的数据
byte[] buf = new byte[1024];
// 包接收器,把接收的数据保存到数组中
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 阻塞式接收
while (true) {
// 监听接收
ds.receive(dp);
// 字节数字输入流
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
// 转换为数据流
DataInputStream dis = new DataInputStream(bais);
// 读取数据
String msg = dis.readUTF();
// 如果是exit 则结束服务端
if (msg.equalsIgnoreCase("exit")) {
break;
}
System.out.println(msg);
}
}
5.2.4クライアント
// 一次发送
public static void test01() throws Exception {
// 发送的数据
String str = "你好";
// 字节数字输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// 写出数据到baos
dos.writeUTF(str);
// 把baos转换为字节数组
byte[] buf = baos.toByteArray();
// 发送数据,大小限制是64K,绑定地址
DatagramPacket dp = new DatagramPacket(buf, buf.length,
new InetSocketAddress("127.0.0.1", 10000));
// 发送,需要通过电脑中一个端口发送出去
DatagramSocket ds = new DatagramSocket(9999);
// DatagramPacket 数据包
// DatagramSocket 通信
ds.send(dp);
ds.close();
}
// 持续发送
public static void test02() throws Exception {
// 发送的数据
String str = null;
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要传递的信息 : ");
// 获取输入的数据
str = sc.nextLine();
while (str != null ) {
// 字节数字输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// 写出数据到baos
dos.writeUTF(str);
// 把baos转换为字节数组
byte[] buf = baos.toByteArray();
// 发送数据,大小限制是64K,绑定地址
DatagramPacket dp = new DatagramPacket(buf, buf.length,
new InetSocketAddress("127.0.0.1", 10000));
// 发送,需要通过电脑中一个端口发送出去
DatagramSocket ds = new DatagramSocket(9999);
// DatagramPacket 数据包
// DatagramSocket 通信
ds.send(dp);
ds.close();
// 如果是exit 则退出客户端
if (str.equalsIgnoreCase("exit")) {
break;
}
System.out.println("请输入需要传递的信息 : ");
// 获取输入的数据
str = sc.nextLine();
}
}