TCP协议(Transmission Control Protocol)
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
TCP协议之所以可靠,是因为采用了三次握手和四次挥手的机制。
- 发送数据前先建立连接,需要三次握手(目的是为了确保两端都能正常发送并接收信息)。
- 正常地 发送/接收数据(采用的是字节流)。
- 发送数据结束时,需要四次挥手(目的是为了确保通信的正常结束)。
举例说明
例如:
小A(发送端)
小B(接收端)
三次握手:
- A:你在吗?—>说明A能发送数据。
- B:我在。—>说明B能接收数据并且也能发送数据。
- A:咱唠会嗑。—>说明A能接收数据,也能发送数据。
三次握手连接建立,证明两端都具有收发数据的能力,接下来就可以发送有用的数据了—>通过socket对象创建输入,输出流。通过流发送字节。
四次挥手:
- A:我不想和你说话了。—>说明A能发送。
- B可能此时正在准备向A发送,或者正在接收A的数据。—>B能接收。
- B:好的,不聊了。—>B能发送数据。
- A接收了B的消息。—>A能接收数据。
底层实现,我们触碰不到,socket已经帮我们封装好了,我们仅仅是拿来使用。
Java实现
客户端:client
服务器:server
先启动服务端,再启动客户端,成功建立连接后,服务端发送数据,客户端再接收数据。
服务端实现步骤:
1.自己创建一个服务ServerSocket 提供一个端口号----ServerSocket
ServerSocket server = new ServerSocket(9999);
2.等待客户端访问—如果客户端访问了该服务端的端口号,即表示socket创建出来,证明三次握手连接成功了。
Socket socket = server.accept();
3.获取字节形式的输出流
OutputStream os = socket.getOutputStream();
4.将字节流包装成字符流
PrintWriter writer = new PrintWriter(os);
5.字符流发送数据
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 和 port,创建socket对象
Socket socket = new Socket("127.0.0.1",9999);
socket创建完毕,证明三次握手完毕,可以连接啦。
2.socket创建字节流
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();
}
}
}
测试
先启动服务器,再启动客户端。