TCP网络数据传输
1.TCP协议是什么?java里的TCP网络数据传输是?
- TCP协议:TCP协议是传输控制协议,位于应用程序层和网络层之间,用于提供可靠的流传递服务,即以字节流的形式传递数据,也以字节流的形式接收数据。TCP使用三个阶段,如连接建立,数据传输和连接终止,并了解三次握手和四次挥手。
三次握手: 建立连接的过程其实就是让通信双方验证各自的发送能力和接受能力是否正常。
LISTEN: 正在侦听来自远方的 TCP 端口的连接请求,服务端启动后处于 LISTEN 状态用于监听不同客户端的 TCP 请求并建立连接;SYN_SEND / SYN_RCVD: 建立连接的中间过程,若连接顺利的话(建立连接过程也可能丢包),这两个状态就一瞬消失;ESTABLISHEN: 连接建立完毕 (验证了通信双方的发送和接受能力都正常),可以进行数据传输。
四次挥手: 确保客户端和服务端的数据能够完成传输,并断开来连接。两个重要的状态:CLOSE_WAIT: 表示在等待关闭; 四次挥手挥了一半了,当前可能剩下的两次不挥了(接收方没调用 close 方法,就会导致四次挥手只挥两次,从而没有正确关闭连接);TIME_WAIT: 谁主动断开连接,谁进入 TIME-WAIT 状态,此时该主机已经完成了四次挥手的过程,但仍不能立刻断开连接,而是要以 TIME-WAIT 状态来保持连接一段时间之后,再彻底释放连接。
- java里的TCP网络数据传输指的是:使用基于TCP协议的Socket网络编程实现,使用Socket对象来代表两端的通信端口,在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
2.TCP网络数据传输的优缺点?
- 优点:可以确保数据以发送时的顺序到达所需的目的地。它是面向连接的,提供了错误检查机制以及恢复机制。它展现了端到端的交流,提供流量控制。该协议展示了服务器(全双工),这意味着它具有执行接收方和发送方角色的能力。
- 缺点:升级 TCP 的工作很困难;TCP 建立连接有延迟,TCP 存在队头阻塞问题;网络迁移需要重新建立 TCP 连接;
3.TCP网络数据传输的编程代码规范是?
- 客户端:创建Socket对象,向服务器发送连接请求,发送服务请求,等待服务响应,关闭流和Socket对象。
- 服务端:创建ServerSocket对象,使用accept方法监听客户端的连接请求,阻塞,等待连接的建立,接收处理信息后反馈信息给客户端,最后关闭流和Socket对象。
做一个小案例:用TCP协议的方式发送一个图片文件给本机。
客户端:
public class TcpClientDemo4 {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
Socket socket = new Socket("localhost", 12306);//创建Socket对象
// 读取流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:/JavaLxK/Tcp/15.jpg"));
// 输出流
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
//写入
int b;
while((b= bis.read()) != -1) {
bos.write(b);
bos.flush();
}
socket.shutdownOutput();
// 读取服务器上的响应数据
BufferedInputStream bis1 = new BufferedInputStream(socket.getInputStream());
byte[] data = new byte[1024];
int len = bis1.read(data);
String str = new String(data,0,len);
System.out.println("收到服务器的消息:"+str);
bos.close();
socket.close();
System.out.println("客户端发送成功");
}
}
服务端:
public class TcpServerDemo4 {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(12306);
System.out.println("服务器已启动...");
while(true){
// 阻塞接收
Socket socket = serverSocket.accept();
new ThreadServer(socket).start();
}
}
}
本节结束,谢谢学习。