TCP协议(伝送制御プロトコル)
伝送制御プロトコル(TCP、伝送制御プロトコル)はコネクション型バイトストリームに基づいて、信頼性の高いトランスポート層の通信プロトコル。
TCPは、マルチネットワークアプリケーションに階層化プロトコルの階層をサポートするために適応するように設計されています。異なるプロセスのホストコンピュータのペアが、相互接続されたコンピュータ通信ネットワークの間に接続されたTCPに依存している信頼性の高い通信サービスを提供します。TCPは、それが簡単で、低レベルのプロトコルから潜在的に信頼できないデータグラムサービスを得ることができ前提としています。原則的に、TCPは、有線、ハードまたは回線交換ネットワークからパケット交換に接続された通信システムのさまざまにわたって動作することができなければなりません。
理由は3ウェイハンドシェイクメカニズムの導入と4の信頼性の高いTCPプロトコルは、手を振った理由。
- 接続を確立するためにデータを送信する前に、あなたは(情報を送受信することができ、通常の終了を確実にするために)スリーウェイハンドシェイクが必要です。
- 通常の送信/(バイトストリームに)データを受信します。
- データ送信の終了時に、それは(通常の通信の終了を確実にするために)は、4つの波を必要とします。
イラスト
例えば:
スモールA(送信側)
小B(受信機)
スリーウェイハンドシェイク:
- A:あなたはありますか? - >説明は、データを送信することができます。
- B:私は。 - > Bは、データを受信し、命令がデータを送信することができます。
- A:私はおしゃべりをつついます。 - >説明Aがデータを受信するために、データを送信することができます。
スリーウェイハンドシェイク接続が確立されて両端がデータを送受信する能力を実証し、その後、有用なデータを送信することができます- >入力と出力を作成したソケットオブジェクトを介してストリーム。バイトは、ストリームで送信されます。
四波:
- A:私はあなたに話をしたくありません。 - > Aは、命令を送信することができます。
- Bは、Aに伝達され、この時点で調製することができる、又はAは、データを受信しています。 - > Bを受け取ることができます。
- B:まあ、話をしません。 - > Bは、データを送信することができます。
- A Bは、メッセージを受信します。 - > Aは、データを受信することができます。
基本的な実装では、我々は触れることができない、ソケットは、我々はそれと使用を取り、私たちに良いパッケージを支援してきました。
Java実装
クライアント:クライアント
サーバー:サーバーは
、サーバーを起動し、クライアントを起動し、正常に接続が確立され、サーバーがデータを送信し、クライアントがデータを受信します。
サーバーの実装手順:
1. 「ポート番号を提供し、サービスのServerSocketを作成しまし ----のServerSocketを
ServerSocket server = new ServerSocket(9999);
2. クライアントアクセス用の待機ソケット、3ウェイハンドシェイクのうち手段の作成は、接続が成功したことを証明することをクライアントアクセスサーバーのポート番号の場合、 - 。
Socket socket = server.accept();
3. フォームのGetバイトストリーム出力
OutputStream os = socket.getOutputStream();
4. 文字ストリームにパックされたバイトストリーム
PrintWriter writer = new PrintWriter(os);
文字伝送データストリーム
TCPServerのコードの実装:
package server;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TCPServer {
public static void main(String[] args) {
try {
System.out.println("====我是服务端===");
//1.自己创建一个服务ServerSocket 提供一个端口号
ServerSocket server = new ServerSocket(9999);
//2.等待客户端访问
Socket socket = server.accept();
//socket创建出来,证明三次握手连接成功了
//字节形式的输出流
OutputStream os = socket.getOutputStream();
//将字节流包装成字符流,为了发送我们的文字提供方便
PrintWriter writer = new PrintWriter(os);
System.out.println("连接成功,输入你想发送的话把:");
Scanner input = new Scanner(System.in);
String str = input.nextLine();
writer.println(str);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
クライアントの実装手順:
1. クライアントは、ソケットオブジェクトを作成し、サーバーのIPアドレスとポートへのアクセスを提供する必要があるため、接続を作成するためのイニシアチブを取る必要があります
Socket socket = new Socket("127.0.0.1",9999);
ソケットが作成された実績のある3ウェイハンドシェイクが完了し、あなたはそれを接続することができます。
2 バイトのストリームを作成するためのソケット
InputStream is = socket.getInputStream();
3. 文字ストリーム(ストリームバイト文字変換)に詰めバイトストリーム
InputStreamReader isr = new InputStreamReader(is);
4. 読み出しデータ
れるtcpClientコードの実装:
package client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
try {
System.out.println("====我是客户端===");
//1.客户端需要主动创建连接,去访问服务器 ip port
Socket socket = new Socket("127.0.0.1",9999);
//socket创建完毕,证明三次握手完毕,可以连接啦
//socket创建的字节流
InputStream is = socket.getInputStream();
//把字节流包装成字符流(字节字符转换流)
InputStreamReader isr = new InputStreamReader(is);
//由于这个isr对象不能读一行,所以我们再进行包装
BufferedReader reader = new BufferedReader(isr);
//reader可以读取一行
String value = reader.readLine();
System.out.println("客户端读到:"+value);
} catch (IOException e) {
e.printStackTrace();
}
}
}
テスト
サーバーを起動し、クライアントを起動します。