【网络编程java】TCP实现文件的上传与下载(附带源码)、三次握手(通俗)介绍、四次挥手(通俗)介绍

一、什么是TCP协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。

其传输的可靠性依赖于三次握手四次挥手

二、三次握手(通俗)

三次握手我们可以认为是通信前的打招呼,其目的是为了防止数据丢失无人响应
在这里插入图片描述
注:当然在真是的情况中,三次握手肯定会更加的复杂,会带有很多参数,我在这里只是做一个通俗的解释。

三、四次挥手(通俗)

四次挥手是在断开连接前的相互打招呼,其目的是防止浏览器一直等待对方给自己发消息,避免造成资源的浪费
在这里插入图片描述
注:当然在真是的情况中,四次挥手肯定会更加的复杂,会带有很多参数,我在这里只是做一个通俗的解释。

四、代码实现前的补充

大概流程:
在这里插入图片描述

1.对于service

对于service而言,其要占用一个端口号,提供给发送方使用
1、java有一个类是Class ServerSocket
其构造方法如下:
在这里插入图片描述
对于上述的构造方法中有一个ServerSocket(int port),通过这个方法来指定端口

ServerSocket socket = new ServerSocket(1234);



2、通过accep() 来侦听要连接到此套接字并接受它,返回值是一个Socket对象
在这里插入图片描述

Socket accept = socket.accept();



3、对于Socket对象,其有一个方法是getInputStream()
在这里插入图片描述

InputStream is = accept.getInputStream();



4、得到输入流了,就可以随心所欲的进行IO操作了

1.对于client/browse

client在给service发送消息会文件时,要知道两个东西,第一个是要知道对方的host第二个是对方要知道开放的端口号(port)


1、在InetAddress类中有一个如下的静态方法,可以通过IP获取对方主机的host
在这里插入图片描述

InetAddress host = InetAddress.getByName("127.0.0.1");


2、在java中有Socket类,其中有一个构造方法如下,可以创建对应接口的套接字Socket
在这里插入图片描述

Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),1234);



3、在Socket类中有获取套接字输出流的方法
在这里插入图片描述

OutputStream os = socket.getOutputStream();

五、源码

client:

package Dome.inet.tcp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @author : HuXuehao
 * @date : 2021年5月31日上午6:21:53
 * @version : TCP实现文件的上传与下载
*/
public class TcpClientDome2 {
	public static void main(String[] args) {
		Socket socket = null;
		OutputStream os = null;
		FileInputStream is = null;
		try {
			//与服务器建立连接
			socket = new Socket(InetAddress.getByName("127.0.0.1"),1234);
			//获取去输出流,给服务器发送消息
			os = socket.getOutputStream();
			
			//读入待发送文件
			is = new FileInputStream(new File("1.docx"));
			
			byte[] buffer = new byte[1024];
			int len = 0;
			//读入
			while((len=is.read(buffer))!=-1) {
				//发送
				os.write(buffer, 0, len);
			}
			System.out.println("ok");
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			if(is!=null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(os!=null) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

service:

package Dome.inet.tcp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author : HuXuehao
 * @date : 2021年5月31日上午6:29:40
 * @version : 
*/
public class TcpServerDome2 {
	public static void main(String[] args) {
		ServerSocket socket = null;
		Socket accept = null;
		InputStream is = null;
		FileOutputStream os = null;
		try {
			//打开一个端口/占用一个端口/指定一个端口
			socket = new ServerSocket(1234);
			//等待用户发送的消息,等待接收
			accept = socket.accept();
			//读入文件,用于接收用户发送的文件使用
			is = accept.getInputStream();
			//写入文件,将将用户的文件进行保存
			os = new FileOutputStream(new File("2.docx"));
			
			byte[] buffer = new byte[1024];
			int len = 0;
			//读入
			while((len=is.read(buffer))!=-1) {
				//写入
				os.write(buffer, 0, len);
			}
			System.out.println("ok");
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//挂芭比资源
			if(os!=null) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(is!=null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(accept!=null) {
				try {
					accept.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

执行顺序:先执行service,再执行client

执行前:
在这里插入图片描述
执行后:
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Windows上使用Python实现TCP三次握手四次挥手如下: 1. 三次握手三次握手是建立TCP连接的过程,主要涉及到客户端和服务器之间的三个步骤。 - 第一步:客户端向服务器发送一个SYN包(SYN=1,ACK=0),表示请求建立连接。 - 第二步:服务器收到SYN包后,向客户端发送一个SYN+ACK包(SYN=1,ACK=1),表示确认连接请求,并同时发送一个与客户端约定好的初始序列号。 - 第三步:客户端收到服务器的SYN+ACK包后,向服务器发送一个ACK包(SYN=0,ACK=1),表示确认连接建立。 2. 四次挥手四次挥手TCP连接的关闭过程,主要涉及到客户端和服务器之间的四个步骤。 - 第一步:客户端向服务器发送一个FIN包,表示主动关闭连接。 - 第二步:服务器收到客户端的FIN包后,返回一个ACK包,确认收到FIN包。 - 第三步:当服务器准备好关闭连接时,发送一个FIN包给客户端。 - 第四步:客户端收到服务器的FIN包后,发送一个ACK包,确认收到FIN包并关闭连接。 在Python中,可以使用socket模块实现TCP三次握手四次挥手。具体代码如下所示: ```python import socket # 三次握手 def three_way_handshake(): server_ip = '服务器IP地址' server_port = 8080 # 客户端向服务器发起连接请求 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((server_ip, server_port)) # 第一次握手:发送SYN包给服务器 client.send(b'SYN') # 第二次握手:接收服务器的SYN+ACK包 response = client.recv(1024) if response == b'SYN+ACK': # 第三次握手:向服务器发送ACK包确认连接建立 client.send(b'ACK') # 连接建立成功 print('TCP连接建立成功') # 关闭连接 client.close() # 四次挥手 def four_way_wave(): server_ip = '服务器IP地址' server_port = 8080 # 客户端向服务器发起连接请求 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((server_ip, server_port)) # 第一次挥手:发送FIN包给服务器 client.send(b'FIN') # 第二次挥手:接收服务器的ACK包 response = client.recv(1024) if response == b'ACK': # 第三次挥手:接收服务器的FIN包 response = client.recv(1024) if response == b'FIN': # 第四次挥手:向服务器发送ACK包确认关闭连接 client.send(b'ACK') # 连接关闭成功 print('TCP连接关闭成功') # 关闭连接 client.close() ``` 以上就是在Windows平台上使用Python实现TCP三次握手四次挥手的方法。需要根据实际情况修改服务器的IP地址和端口号。 ### 回答2: 在Windows中,可以使用Python来实现TCP三次握手四次挥手三次握手是建立TCP连接的过程。首先,客户端发送一个SYN(同步)数据包给服务器,其中包含自己的初始序列号。服务器收到后,回复一个SYN-ACK(同步-确认)数据包,其中包含自己的初始序列号和确认号(即加1)。最后,客户端向服务器发送一个ACK(确认)数据包,其中确认号为服务器发来的序列号加1。这样,TCP连接就建立了。 具体的Python代码如下: ```python import socket def handshake(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8080) client_socket.connect(server_address) # 第一次握手:客户端发送SYN client_socket.send(b'SYN') # 第二次握手:服务器发送SYN-ACK data = client_socket.recv(1024) if data == b'SYN-ACK': # 第三次握手:客户端发送ACK client_socket.send(b'ACK') print('TCP连接已建立') client_socket.close() handshake() ``` 四次挥手是关闭TCP连接的过程。首先,客户端发送一个FIN(结束)数据包给服务器,表示不再发送数据。服务器收到FIN后,回复一个ACK确认收到,并在接下来的某个时间发送自己的FIN。客户端收到服务器的FIN后,回复一个ACK确认收到,然后等待一段时间,最后关闭连接。 具体的Python代码如下: ```python import socket def close_connection(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8080) client_socket.connect(server_address) # 第一次挥手:客户端发送FIN client_socket.send(b'FIN') # 第二次挥手:服务器发送ACK data = client_socket.recv(1024) if data == b'ACK': # 第三次挥手:服务器发送FIN data = client_socket.recv(1024) if data == b'FIN': # 第四次挥手:客户端发送ACK client_socket.send(b'ACK') print('TCP连接已关闭') client_socket.close() close_connection() ``` 以上就是使用Python在Windows中实现TCP三次握手四次挥手的步骤和代码。 ### 回答3: TCP是一种可靠的传输控制协议,它通过三次握手建立连接和四次挥手断开连接。在Windows系统上,可以使用Python编写代码来实现TCP三次握手四次挥手三次握手实现如下: 1. 创建服务器端和客户端的Socket对象。 2. 服务器端监听指定的端口,等待客户端连接。 3. 客户端发起连接请求,向服务器发送SYN包。 4. 服务器端收到SYN包后,回复一个SYN-ACK包,确认客户端的连接请求,并分配一个通信端口。 5. 客户端收到SYN-ACK包后,发送一个ACK包,确认服务器的连接确认。 6. 服务器收到ACK包后,完成三次握手,双方建立了可靠的连接。 四次挥手实现如下: 1. 客户端发送一个FIN包,表示要断开连接。 2. 服务器收到FIN包后,发送一个ACK包,确认客户端的断开请求。 3. 服务器发送一个FIN包,表示服务器也要断开连接。 4. 客户端收到FIN包后,发送一个ACK包,确认服务器的断开请求。 5. 服务器收到ACK包后,完成四次挥手,双方断开了连接。 通过编写Python代码可以实现TCP三次握手四次挥手操作,具体步骤如上所述。在Windows系统上,可以使用Python的socket模块来实现Socket对象的创建和数据传输。需要注意的是,在编写代码时,要遵循TCP协议的规定,确保握手和挥手的顺序和数据包的格式正确。 这样,在Windows系统上,可以使用Python来实现TCP三次握手四次挥手,从而建立和断开网络连接。这对于实现网络通信和数据传输非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值