個人的な理解:
通常の使用パターンは、両方の組み合わせです、異なるUDPとTCPを区別することを学ぶ!より良い輸送のために、多くの場合、伝送のために複数のスレッドを開きます!
ネットワーク通信プロトコル:
1、TCP / IPプロトコル:
四層:アプリケーション層、トランスポート層、ネットワーク層およびリンク層:
リンク層:リンク層は、物理伝送チャネルを定義するために使用され、通常、特定のプロトコル・ネットワーク用の駆動装置に接続された、例えば、光学ドライブ、ケーブルが提供さ。
ネットワーク層:ネットワーク層は、主に伝送されるデータパケットのために使用されるTCP / IPプロトコルの核心である先のコンピュータまたはネットワークにパケットデータを送信します。
トランスポート層:ネットワーク通信時の通信ネットワークは、TCPプロトコルを使用することができる主なプログラムは、UDPプロトコルを使用することができます。
アプリケーション層:例えばHTTPプロトコル、FTPプロトコルとして、プロトコルのアプリケーションのために主に責任を負います。
2、IPアドレスとポート番号:
一意のコンピュータを識別する①、IPアドレス:
以前はIPV4、IPV6は現在、アドレスの16バイトです。
②、ポート番号:2バイト:0〜65535。一般的には1024以上のポート番号。
3、InetAddressクラス:
{クラスDemo01公共
パブリック静的な無効メイン(文字列[] argsが){UnknownHostExceptionがスロー
のInetAddressのINET = InetAddress.getByName( "192.168.1.163")を、自身である// IPアドレスの
対象から取得// IPアドレス
のSystem.out .println(inet.getHostAddress());
//ホスト名を取得
するSystem.out.println(inet.getHostNameを());
//取得ローカルホストのIPオブジェクト
のInetAddress inet2 =のInetAddress.getLocalHost();
System.out.printlnは( inet2.getHostAddress());
のSystem.out.println(inet2.getHostName());
}
}
二、UDPおよびTCPプロトコル:
1、UDPプロトコル:
ユーザーデータグラムプロトコルユーザーデータグラムプロトコル - コネクションレスプロトコル:あなたは浸る、データの整合性を保証することはできません!!!64K以下です。
2、TCPプロトコル:
伝送制御プロトコル---伝送制御プロトコル接続指向の通信プロトコル。
データが送信される前に、送信側への論理接続を確立し、送信前にデータの端部を受けます。
TCP接続は、各接続が通過する必要が作成し、明確なクライアントとサーバー、クライアントからサーバーへの接続要求でなければなりません「3ウェイハンドシェイク。」最初のハンドシェークは、クライアントは、サーバが、第二のハンドシェイクを確認するために、サーバは、クライアントに応答を送信するために待機して、サーバへの接続要求を送信し、クライアントは、通知の接続要求、第三握手、再びサーバーにクライアントを受け取ります接続を確認する確認メッセージを送信します。
三、UDP通信:
1、のDatagramPacket:データパッケージクラス:
通信を送信または受信するためのUDPカプセル化データ。
2、DatagramSocketの:「ターミナル」:データ・パケットを送受信することができますのDatagramPacket
インポートにjava.io.IOException;
輸入java.net.DatagramPacket。
インポートjava.net.DatagramSocket;
輸入java.net.InetAddress;
輸入java.net.SocketExceptionが、
輸入java.net.UnknownHostExceptionを発行。
//送信側
パブリッククラスUDPSend {
公共の静的な無効メイン(文字列[]引数)にIOException {スロー
//カプセル化されたデータの
バイト= "こんにちはUDP" .getBytes()[]バイト;
// IPアドレスカプセル化
のInetAddress INET =のInetAddress。 getByName( "127.0.0.1");
// 1。送信するデータをカプセル化するオブジェクト、長さ、IPアドレスとポート番号の受信端パッキングデータ作成
のDatagramPacket新しい新しいDP =(バイト、bytes.length、INET、6000)ののDatagramPacketのを、
2 // DatagreamSocketオブジェクト(エクスプレス)を作成し
たDatagramSocket DSをDatagramSocketの新しい新=();
//パケットを送信3.。
ds.send(DP)を;
//解放資源
ds.closeを();
}
}
インポートにjava.io.IOException;
輸入java.net.DatagramPacket。
インポートjava.net.DatagramSocket;
輸入java.net.SocketExceptionが、
//受信端
パブリッククラスUDPReceive {
公共の静的な無効メイン(文字列[] argsが)にIOException {スロー
// DatagramSocketオブジェクト、クリアポート番号作成
DatagramSocketの新しい新しいDS =たDatagramSocket(6000)
。2 //入ってくるバイト配列を処理する責任を作成しますするデータ
[]バイト=新しい新しいバイト[1024]バイト;
.. 3 //オブジェクトアンパックデータ作成
のDatagramPacket新しい新しいDP =(バイト、bytes.length)ののDatagramPacketのを;
// 4パケットを受信する。
ds.receive(DP)。
// 5開梱
//取得し、受信データ長
INT長= dp.getLength();
//送信元のIPアドレスを取得する
文字列をdp.getAddress IP =()はgetHostAddress();.
//送信側のポート番号を取得
INTをポート= dp.getPort()。
System.out.println( "IPアドレス:" + IP + "ポート番号" +ポート+ "コンテンツ伝送がある:" +新しい新しい文字列(バイト0、長さ));
}
}
四、TCP通信:
1、ServerSocketのカテゴリ:サーバー側; Socketクラス:クライアント。
//クライアント
のパブリッククラスれるtcpClient {
公共の静的な無効メイン(文字列[] args)はUnknownHostExceptionが、IOExceptionが{スロー
// 1.明確に接続するためのソケットオブジェクト、サーバーのアドレスとポート番号を作成
ソケットソケット=新しいソケット(「127.0.0.1 "8888);
// 2明確なデータソース。
FileInputStreamの新しい新しいFISはのFileInputStream(=" D:\\ \\「JavaのA.TXTを);
... 3 //オブジェクトのsockeからバイトストリームの出力を取得し、読んで準備ができてサーバファイルのバイトが書かれ
たOutputStream Socket.getOutputStream OUT =を();
... 4は、コピーを開始//
int型のlen = 0;
バイト[]バイト=新しい新しいバイト[1024];
しばらく((LEN = fis.read(バイト))! -1 =){
out.write(バイト0、LEN);
}
//出力ストリームの最後に、サーバはエンドに伝え、読んでいない
socket.shutdownOutputを();
戻り//受信サーバ
//バイトのソケットの入力ストリームからオブジェクトを取得し、データ・サーバの応答が受信
Socket.getInputStream =()に入力ストリームを、
LEN = in.read(バイト)
のSystem.out.println(新しい新しい文字列(バイト0、 LEN));
//リリースリソース
Socket.close();
fis.close();
}
}
図2に示すように、マルチスレッド転送:
//スレッドのタスクオブジェクト
のパブリッククラスのアップロードを実装したRunnable {
プライベートソケットソケット。
パブリックアップロード(){
}。
公共のアップロード(ソケットソケット){
this.socket =ソケット。
}。
空パブリック(){RUN
たFileOutputStreamのFOS =ヌル;
試み{
//明らか先3.
ファイルファイル=新しい新しいファイル( "D:\\ NiHao");
ディレクトリが存在しない//場合は、作成
するif(file.existsを! ()){
file.mkdirs();
}
文字列のファイル名= "オラクル" +のSystem.currentTimeMillis()+ ".txtファイル";
//クリア先
FOS =新しい新たFileOutputStream(File.separator + +ファイル名のファイル);
//クリアデータソース
Socket.getInputStreamにおける入力ストリーム=();
コピーを開始//
INT LEN = 0;
バイト[]バイト=新しい新しいバイト[1024];
ながら(!(LEN = in.read(バイト))= -1){
fos.write(バイト、0、LEN);
}
クライアントに応答//
//は、バイトの出力ストリームを取得し、クライアントに応答
)のOutputStream Socket.getOutputStream OUT =(;
out.write( "成功したアップロード" .getBytes()) ;
}キャッチ(IOExceptionをEX){
ex.printStackTrace();
}最後に{
//リリースリソース
試し{
fos.close();
}キャッチ(IOExceptionをE){
// TODO自動生成されたブロックキャッチ
e.printStackTrace();
}
}
}
}
パブリッククラスデモ{
静的な無効メインパブリック(String []型引数)はIOExceptionが{スロー
... 1つの//サーバーオブジェクト作成された
ServerSocketをサーバーに新しい新しい= ServerSocketを(8888);
ながら、(真の){
//接続クライアントオブジェクト取得作成
(ソケットソケット= server.acceptを) ;
/ * //スレッド(スレッドの作成タスク)を作成し
、新たな新しいスレッド(新しい新しいアップロード(ソケット))スタート();. * /
//スレッドのタスクを作成
アップロード新しいアップ新しい=アップロード(ソケット);
//スレッドオブジェクトの作成
スレッドのスレッドを=スレッド新新(アップ);
//オープンスレッド
Thread.start();
}
}
}