概述
通过socket编程,实现下载功能,具体如下:
客户端连接服务器,向服务器发送要下载的文件名,服务器根据文件名读取该文件(如果文件过大,一次读取会内存溢出,所以分块读取),然后向客户端发送数据,客户端接收到后写入磁盘
客户端
# 导入模块
import socket
# 创建套接字
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接
socket.connect(("127.0.0.1", 8080))
filename = input("请输入要下载的文件:")
socket.send(filename.encode('utf-8'))
try:
file=open(filename, "wb")
while True:
# 接收数据
data = socket.recv(1024)
if data:
file.write(data)
else:
break
file.close()
except Exception as e:
print("下载异常", e)
print(filename, "下载成功")
socket.close()
服务器端
# 导入模块
import socket,threading
class FileThread(threading.Thread):
def __init__(self,socket,addr):
super().__init__()
self._socket=socket
self._addr=addr
def run(self):
print("客户端:", self._addr, "连接")
# 接收下载的文件名
file_name_data = self._socket.recv(1024)
# 对文件名进行解码
file_name = file_name_data.decode()
try:
file=open( file_name, "rb")
while True:
# 每次读取1k
file_data = file.read(1024)
# 有数据就发送
if file_data:
self._socket.sendall(file_data)
else:
break
except Exception as e:
print("传输异常:", e)
finally:
file.close()
# 关闭连接
self._socket.close()
def main():
# 创建tcp服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
server_socket.bind(("0.0.0.0", 8080))
# 设置监听,把服务端socket由主动套接字改成被动套接字,只能接收客户端的连接请求
server_socket.listen(5)
while True:
# 接收客户端信息
client_socket, addr = server_socket.accept()
FileThread(client_socket,addr).start()
if __name__ == "__main__":
main()