一、TCP通信原理
TCP(Transmission Control Protocol)协议是面向链接的通信协议,即
数据传输之前,先在发送端和接收端建立逻辑链接,然后再传输数据,它提供
了两台计算机之间可靠无差错的数据传输。
TCP通信中必须明确客户端和服务器端,由客户端向服务端发送连接请求
每次连接的创建都要经过三次握手。
三次握手:
第一次握手:客户端向服务端发出连接请求,等待服务器确认。
第二次握手:服务端向客户端回复一个响应,通知客户端收到连接请求
第三次握手:客户端再次向服务端发送确认信息,确认连接
完成三次握手之后,连接建立,客户端和服务端开始进行数据传输,可以
保证数据安全。
数据传输结束以后,断开连接会进行四次挥手。
四次挥手:
第一次挥手:客户端向服务端发送断开连接请求,表示数据发送完毕。
第二次挥手:服务端收到请求后,回复客户端,同意关闭连接的请求。
第三次挥手:服务端向客户端发出断开连接的请求。
第四次挥手:客户端收到服务端请求后,向服务端发送确认信息,服务端接收
到确认信息后断开连接。客户端等待之后没有收到服务端的回复,证明服务端
已正常关闭,客户端也关闭。
二、TCP发送数据
发送数据的步骤:
1、创建客户端Socket对象
2、获取输出流,写入数据
3、释放资源
三、TCP接收数据
接收数据的步骤:
1、创建服务端的Socket对象
2、监听客户端连接,返回Socket对象
3、获取输入流读取数据
4、释放资源
四、TCP通信案例
/*
TCP客户端
*/
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象
//Socket(String host, int port)
// 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket s = new Socket("192.168.1.5", 10000);
//OutputStream getOutputStream()返回此套接字的输出流
OutputStream outputStream = s.getOutputStream();
//写入一个字符串
outputStream.write("Hello".getBytes());
//告诉服务端发送结束
// void shutdownOutput() 禁用此套接字的输出流。
s.shutdownOutput();
//关闭客户端
s.close();
}
//TCP服务端
public static void main(String[] args) throws IOException {
//创建服务端的ServerSocket对象
//ServerSocket(int port)创建绑定到特定端口的服务器套接字。
ServerSocket ss = new ServerSocket(10000);
//获取输入流读取数据,并把数据显示在控制台
//Socket accept()侦听并接受到此套接字的连接。
Socket socket = ss.accept();
// InputStream getInputStream()返回此套接字的输入流。
InputStream inputStream = socket.getInputStream();
//读取一次数据
byte[] bytes = new byte[1024];
// int read(byte[] b, int off, int len)
// 将输入流中最多 len 个数据字节读入 byte 数组。
int len = inputStream.read(bytes);
String str = new String(bytes,0, len);
System.out.println("接收到的数据是:" + str);
//关闭服务端
ss.close();
}
先运行服务端后运行客户端。
运行结果:
服务端输出:
接收到的数据是:Hello!
发送端无任何信息