tcp协议(二)
tcp数据传输综合案例
案例:文件下载器
功能分析
文件下载器客户端:
import socket
"""
1.创建socket对象
2.连接服务端 connect
3.发送接收信息
创建下载文件名
4.关闭连接
"""
# 1.创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.连接服务端 connect
client_socket.connect(('192.168.43.51', 6666))
# 3.发送接收信息
print(client_socket.recv(1024).decode())
# 输入是否下载
num1 = input()
client_socket.send(num1.encode())
# 输入下载文件路径
print(client_socket.recv(1024).decode())
file_path = input()
client_socket.send(file_path.encode())
names = file_path.split('/')[-1]
# 接收正在下载
print(client_socket.recv(1024).decode())
# 创建下载文件名
try:
# file_name = open('/home/python/Downloads/' + names, 'wb')
# with 打开文件 不需要手动关闭 会自动关闭文件
with open('/home/python/Downloads/' + names, 'wb') as file_name:
while True:
content = client_socket.recv(1024)
if content:
file_name.write(content)
else:
break
except Exception as result:
print(result)
else:
print(names + "下载完成")
# 4.关闭连接
client_socket.close()
文件下载器服务端
import socket
"""
1.创建socket对象
2.绑定端口
3.listen设置监听 socket由主动变为被动
4.accept 等待连接 返回的是元组 第一个是socket对象 第二个是客户端ip和端口
5.接收数据
6.发送数据
读取文件中数据进行发送
7.关闭当前客户端连接
8.关闭连接
"""
# 1.创建socket对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置 服务器端地址可以重用
# tcp_socket.setsockopt(当前socket, 属性名, 属性值) 设置套接字属性
# socket.SOL_SOCKET 当前socket
# socket.SO_REUSEADDR 重复使用地址 True 可以重用 False 不可以重用(默认)
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2.绑定端口
tcp_socket.bind(('', 6666))
# 3.listen设置监听 socket由主动变为被动
tcp_socket.listen(128)
# 4.accept 等待连接 返回的是元组 第一个是socket对象 第二个是客户端ip和端口
while True:
client_socket, ip_port = tcp_socket.accept()
print('[新的客户端:]', ip_port)
client_socket.send("是否下载文件:1.是 0.否".encode())
# 5.接收数据
recv_data = client_socket.recv(1024).decode()
if recv_data == "1":
client_socket.send("请输入文件路径:".encode())
recv_file = client_socket.recv(1024).decode()
client_socket.send("正在下载...".encode())
# 6.发送数据,打开文件
# file = open(recv_file, 'rb')
with open(recv_file, 'rb') as file:
while True:
# 读取文件中数据进行发送
content = file.read(1024)
if content:
client_socket.send(content)
else:
break
client_socket.close()
else:
# 7.关闭当前客户端连接
client_socket.close()
# 8.关闭连接
# tcp_socket.close()