【Java】–网络编程:基于TCP协议的网络通信
文章目录
- 【Java】--网络编程:基于TCP协议的网络通信
- 一、TCP协议
-
- 1.1 概念:
- 1.2 三次握手
-
- 1.2.1 文字描述
- 1.2.2 画图演示
- 1.3 四次挥手
-
- 1.3.1 文字描述
- 1.3.2 画图演示
- 二、基于TCP的Socket网络编程
-
- 2.1 概念
- 2.2 服务器端的开发步骤
-
- 2.2.1 文字描述
- 2.3 客户端的开发步骤
-
- 2.3.1 文字描述
- 总结
一、TCP协议
1.1 概念:
TCP协议(Transmission Control Protocol),即传输控制协议,是一种
建立连接的过程需要
断开连接的过程需要
使用TCP协议的通信双方分别为
客户端负责向服务器端发送数据,服务器端负责接收客户端的数据并给出反馈。两者地位不相同。
1.2 三次握手
1.2.1 文字描述
使用TCP协议的通信双方,建立通信连接需要
- 客户端向服务器端发送 建立连接请求(SYN) 数据包。
- 服务器端接收到客户端的SYN包,发送 确认信息(ACK) 数据包,表示收到了客户端发来的数据包,同时发送SYN,请求与客户端建立连接。
- 客户端接收到服务器端发来的ACK + SYN数据包之后,发送ACK数据包,表示收到了服务器发来的数据包。至此,客户端和服务器之间建立连接。
1.2.2 画图演示
1.3 四次挥手
1.3.1 文字描述
使用TCP协议的通信双方,断开已经建立的连接需要
- 客户端向服务器端发送 断开连接请求(FIN) 数据包。
- 服务器接收到客户端的FIN数据包,先向客户端发送ACK数据包,表示收到了客户端发来的数据包,并准备断开客户端的连接。
- 服务器处理好断开连接所需事宜后,向客户端发送FIN + ACK数据包,表示与客户端断开连接。
- 客户端接收到服务器端的FIN + ACK数据包,向服务器端发送ACK数据包,表示收到了服务器端发送的数据包。至此,客户端与服务器端断开连接。
1.3.2 画图演示
二、基于TCP的Socket网络编程
2.1 概念
Socket(套接字)是由操作系统提供的
因为基于TCP协议,在使用Socket进行网络编程时需要分别进行服务器端的开发和客户端的开发。
2.2 服务器端的开发步骤
2.2.1 文字描述
- 创建ServerSocket对象,并指定端口号。
ServerSocket listener = new ServerSocket(10086);//指定服务器端的端口号
- 侦听客户端的连接,并返回客户端的套接字。
Socket clientSocket = listener.accept(); //注意:accept()是一个阻塞方法,在获得客户端的套接字之前不会执行后面的代码。
- 与客户端建立连接后,通过输入流来获取客户端的输出流。
//用于接收客户端的数据 InputStream is = clientSocket.getInputStream(); //用于向客户端输出数据 OutputStream os = clientSocket.getOutputStream(); //使用转换流将字节流转成字符流,并规定读取和输出的编码格式为UTF-8 InputStreamReader isr = new InputStreamReader(is,"UTF-8"); OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8"); //将字符流转换成字符缓冲流,效率更高 BufferedReader br = new BufferedReaer(isr); BufferedWriter bw = new BufferedWriter(osw);
- 处理数据
String data = br.readLine();//读取一行数据 System.out.println("客户端说:" + data); String s = "已接收到数据"; bw.write(s);//向客户端发送反馈 bw.newLine();//换行 bw.flush();//刷新缓存
- 关闭
listener.close(); clientSocket.close(); is.close(); os.close(); isr.close(); osw.close(); br.close(); bw.close();
2.3 客户端的开发步骤
2.3.1 文字描述
- 创建客户端套接字对象,并指定服务器端的地址和端口号。
//指定服务器端的地址和端口号 Socket ClientSocket = new Socket("10.9.48.155",10086);
- 获取输出流和输入流
//用于向服务器端输出数据 OutputStream os = ClientSocket.getOutputStream(); //用于接收服务器端的反馈 InputStream is = ClientSocket.getInputStream(); //将字节流通过转换流转换成字符流 OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8"); InpusStreamReader isr = new InputStreamReader(is,"UTF-8"); //将字符流转换成字符缓冲流,效率更高 BufferedWriter bw = new BufferedWriter(osw); BufferedReader br = new BufferedReader(isr);
- 处理数据并发送
String s = "好久不见,甚是想你"; bw.write(bw); bw.newLine();//另起一行,令客户端知道上一行是需要接收的内容 bw.flush();//刷新缓存,零数据发送出去 String feedback = br.readLine(); System.out.println("服务器回应道:" + data);
- 关闭
ClientSocket.close(); os.close(); is.close(); osw.close(); isr.close(); bw.close(); br.close();
总结
这篇文章讲解了什么是网络编程,以及在java中如何实现基于TCP协议的网络编程。