file_server.py
import socket
import osif __name__ == '__main__':
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号
tcp_server_socket.bind(("", 8989))
# 设置监听,把主动套接字改成被动套接字,也就是服务端的套接字只能接收客户端的连接请求,不能收发消息
tcp_server_socket.listen(128)
# 等待客户端的连接请求
service_client_socket, ip_port = tcp_server_socket.accept()
print(ip_port)
# 接收客户端的请求数据
file_name_data = service_client_socket.recv(1024)
# 对二进制数据解码获取请求的文件名
file_name = file_name_data.decode("gbk")
print(file_name)# 1. 判断打开文件是否抛出异常,如果抛出异常表示文件不存在,否则文件存在
# 2. os判断文件是否存在
# 如果不加路径,默认在当前工程进行判断, 如果加上指定路径,那么判断就是指定路径是否有对应的文件
if os.path.exists(file_name):with open(file_name, "rb") as file:
while True:
# 读取文件数据
file_data = file.read(1024)
if file_data:
# 表示有数据, 读取一点数据发送一点数据
service_client_socket.send(file_data)
else:
breakelse:
print("请求的文件不存在")# 终止和客户端服务
service_client_socket.close()
# 终止客户端的连接请求
tcp_server_socket.close()file_client.py
import socket
if __name__ == '__main__':
# 创建tcp客户端套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
tcp_client_socket.connect(("192.168.138.69", 8989))# 接收用户请求下载的文件名
file_name = input("请输入您要下载的文件名:")
# 对字符串使用gbk进行编码
file_name_data = file_name.encode("gbk")
# 发送数据给服务端
tcp_client_socket.send(file_name_data)with open("/home/python/Desktop/" + file_name, "wb") as file:
# 接收多次数据
while True:
file_data = tcp_client_socket.recv(1024)
if file_data:
# 把收到的数据写入到指定文件里面
file.write(file_data)
else:
# 表示服务端把数据发送完成并且关闭连接了
break# 关闭套接字
tcp_client_socket.close()