ネットワークプログラミング
ネットワークプログラミングの概要
ネットワーク
異なる場所に位置し、それぞれ独立した機能を持つ複数のコンピュータと外部機器を通信回線で接続し、ネットワークオペレーティングシステム、ネットワーク管理ソフトウェアおよびネットワーク通信プロトコルの管理・調整により、リソース共有と情報伝達を実現するコンピュータシステムです。
極域
ネットワークプログラミング
異なるコンピュータ上で動作するプログラム同士がデータを交換できるようにするための技術です。
ネットワークモデル
OSI(Open Systems Interconnection)参考モデル
1. 物理層
物理デバイス標準を定義します。たとえば、ネットワークケーブルのインターフェース、光ファイバーの接続方式、各種伝送媒体の速度などです。この層の主な機能はビットストリームの伝送です(1と0を電流の強さに変換して伝送し、受信側では再び1と0に変換します。これはデジタルとアナログの変換とも呼ばれます)。この層のデータはビットと呼ばれます。
2. データリンク層
物理層から受け取ったデータをMACアドレス(ネットワークカードのアドレス)でラップまたはアンラップします。この層のデータはフレームと呼ばれます。この層で動作するデバイスはスイッチで、データはスイッチを通じて転送されます。
3. ネットワーク層
下位層から受信したデータをIPアドレス(例:192.168.0.1)でラップまたはアンラップします。この層で動作するデバイスはルータで、この層のデータはパケットと呼ばれます。
4. トランスポート層
データの伝送プロトコルとポート番号(例:WWWのポート80)を定義します。TCP(伝送制御プロトコル、効率は低いが信頼性が高い、大容量データの伝送に使用)、UDP(ユーザーデータグラムプロトコル、TCPとは逆の特徴を持ち、信頼性が高くないが軽量なデータ伝送に使用、QQのチャットデータはこれを使用して送信されます)。下位層から受け取ったデータをセグメントに分割して送信し、受信側で再構成します。この層のデータはセグメントと呼ばれます。
5. セッション層
トランスポート層(ポート番号:送信ポートと受信ポート)を通じてデータ伝送経路を確立します。システム間のセッションの開始または受信要求を処理します(デバイス同士はIPアドレス、MACアドレス、またはホスト名で認識する必要があります)。
6. 表現層
受信したデータの解釈、暗号化と復号化、圧縮と展開を行います(コンピュータが認識できる形式を人間が認識できる形式に変換します。例:画像や音声など)。
7. 応用層
端末アプリケーションに関わる層です。たとえばFTP(ファイルダウンロード)、WEB(ブラウザ)、QQ(画面に表示されるアプリケーション)などが含まれます。
TCP/IP参考モデル
ネットワーク通信の三要素
1.IPアドレス:InetAddress
ネットワーク上のデバイスを識別するもので、記憶しづらく、ホスト名で代用できます。
A: IPアドレスとはインターネットに接続された各ホストに割り当てられる32ビットのアドレスです。TCP/IPの規定により、IPアドレスは2進数で表記され、32ビット=4バイトです。例えば「00001010000000000000000000000001」という長いアドレスは人間には扱いにくいです。便宜上、10進数表記で「.」で区切って表記します。つまり上記のアドレスは「10.0.0.1」となります。この表記法は「ドット区切り10進数表現」と呼ばれ、1と0より覚えやすいです。
B: IPアドレスの構成
IPアドレス = ネットワーク番号 + ホスト番号
AクラスIPアドレス: 最初の1つ目の番号がネットワーク番号、残りの3つがホスト番号
BクラスIPアドレス: 最初の2つの番号がネットワーク番号、残りの2つがホスト番号
CクラスIPアドレス: 最初の3つの番号がネットワーク番号、最後の1つがホスト番号
特殊アドレス:
127.0.0.1 ループバックアドレス、ローカルネットワークの確認に使用できます。ping 127.0.0.1
DOSコマンド ipconfig: ローカルIPアドレスの確認
CentOS7:ip addr
CentOS6: ifconfig
xxx.xxx.xxx.0 ネットワークアドレス
xxx.xxx.xxx.255 ブロードキャストアドレス
Aクラス 1.0.0.1---127.255.255.254 (1)10.X.X.Xはプライベートアドレス(インターネット上では使用せず、LAN内で使用されるアドレス)
(2)127.X.X.Xは予約アドレス、ループテストに使用
Bクラス 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255はプライベートアドレス。169.254.X.Xは予約アドレス。
Cクラス 192.0.0.1---223.255.255.254 192.168.X.Xはプライベートアドレス
Dクラス 224.0.0.1---239.255.255.254
Eクラス 240.0.0.1---247.255.255.254
InetAddressクラス
import java.net.InetAddress;
/*
InetAddress: IPアドレスを表すJavaのクラス
*/
public class InetAddressExample {
public static void main(String[] args) throws Exception {
// static InetAddress getLocalHost()
// ローカルホストのIPアドレスを返します。
InetAddress address1 = InetAddress.getLocalHost();
System.out.println(address1);
// String getHostName()
// このIPアドレスのホスト名を取得します。
String hostName = address1.getHostName();
// String getHostAddress()
// このIPアドレスのアドレスを取得します。
String ipAddress = address1.getHostAddress();
System.out.println("ホスト名: " + hostName + ", IPアドレス: " + ipAddress);
}
}
2. ポート番号
プロセスを論理的に識別するために使用します。異なるプロセスを識別するために使用されます。
3. 通信プロトコル
通信のルールです。
一般的なプロトコル:TCP、UDP
UDPプロトコル
データソースと送信先をデータグラムとしてカプセル化し、接続を確立する必要はありません。各データグラムのサイズは64KBまでに制限されます。接続がないため、信頼性のないプロトコルです。接続を確立しないため、高速です。
UDP通信
DatagramSocketとDatagramPacket
送信側と受信側のソケットを構築します。
データパケットを作成します。
ソケットの送信・受信メソッドを使用します。
ソケットを閉じます。
送信側と受信側は独立したプログラムです。
送信側の手順
1: UDPソケットサービスを構築します
2: 送信するデータをデータグラムにカプセル化します
3: UDPソケットサービスを使ってデータグラムを送信します
4: リソースを解放します
送信側コード
受信側の手順
1: UDPソケットサービスを構築します
2: receiveメソッドでデータを受信します
3: 受信したデータをデータグラムオブジェクトに格納します
4: データグラムオブジェクトの機能を使用して受信データを解析します
5: リソースを解放します
受信側コード
TCPプロトコル
接続を確立し、データ伝送のチャネルを形成します。接続中に大量のデータを転送できます。3回のハンドシェイクにより接続が確立され、信頼性のあるプロトコルです。接続が必要なため、効率は多少低下します。
TCP通信
SocketとServerSocket
クライアントとサーバーを構築します。
接続確立後、SocketのIOストリームを使用してデータを送受信します。
Socketを閉じます。
クライアントとサーバーはそれぞれ独立したアプリケーションです。
クライアントの手順
1: クライアントのSocketサービスを構築し、接続先サーバーを指定します
2: 接続が確立されれば、データ転送チャネルが確立されます。このチャネルでIOを使用してデータの読み書きが可能です。このチャネルはSocketストリームと呼ばれ、読み取りストリームと書き込みストリームを持っています
3: Socketオブジェクトのメソッドでこれらのストリームを取得します
4: ストリームを使用してデータを送受信します
5: データ送信完了後、リソースを解放します
クライアントコード
サーバー側の手順
1: サーバー側のSocketサービスを構築し、ポート番号を指定します
2: サーバー側では直接ストリーム操作は行わず、acceptメソッドでクライアントオブジェクトを取得し、そのストリームを使ってクライアントと通信します
3: クライアントからストリームオブジェクトを取得してデータの読み書きを行います
4: サービス終了後、クライアントを閉じ、サーバーを閉じます。ただし、通常はサーバーを閉じず、クライアントのみを閉じます。サーバーは常にサービスを提供するためです
サーバー側コード
TCP通信での問題点
クライアントがサーバーに接続すると、両方とも待機状態になり、データの送受信が行われません。
例による分析:
readメソッドまたはreadLineメソッドはブロックモードです。
解決策:
終了マークを自作する
shutdownInput、shutdownOutputメソッドを使用する
Socket
Socket(ソケット):
ネットワーク上の一意のIPアドレスとポート番号の組み合わせによって識別されるものです。
Socketの仕組み:
通信の両端にはSocketがあります。
ネットワーク通信とは、Socket同士の通信です。
データは2つのSocket間のIOを通じて送られます。
Socketの仕組み図解