tcp 小尝试 文件下载器
为了真实模拟 客户端用windows 下面的pycharm 写的,服务端用ubuntu 下面的pycharm 写的
客户端
import socket
if __name__ == '__main__':
# 创建tcpsocket客户端
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 和服务端建立连接
tcp_client_socket.connect(("192.168.36.111", 8989))
# 接收用户输入文件名
file_name = input("请输入您要下载的文件名:")
# 对字符串数据进行编码
file_data = file_name.encode("gbk")
# 发送下载文件的数据请求
tcp_client_socket.send(file_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
# 关闭socket
tcp_client_socket.close()
服务端
import socket
import os
if __name__ == '__main__':
# 创建tcp服务端socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置socket选项
# 1. SOL_SOCKET: 表示当前socket
# 2. SO_REUSEADDR:是否重用的选项
# 3. True: 表示重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server_socket.bind(("", 8989))
# 设置监听,把主动套接字改成被动套接字,被动套接字只负责接收客户端的连接请求
tcp_server_socket.listen(128)
# 提示:目前的服务端是单任务的下载,一个用户下载完成以后另外一个用户才能下载文件
# 循环接收客户端连接请求
while True:
# 等待接收客户端的连接请求
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)
# file = open(file_name, "rb")
# 1. 判断文件是否存在
if os.path.exists(file_name):
# 文件操作完成以后,自动关闭文件对象
# file:表示文件对象
with open(file_name, "rb") as file:
while True:
# 读取数据
file_data = file.read(1024)
if file_data:
# 数据读取到了,然后发送给客户端
service_client_socket.send(file_data)
else:
# 文件数据读取完成,跳出循环
break
else:
print("文件不存在")
service_client_socket.close()
tcp_server_socket.close()