一、客户端
import socket
if __name__ == '__main__':
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接
tuple1 = ('192.168.44.128', 8800)
tcp_client_socket.connect(tuple1)
while True:
# 发送消息
file_url = input('请输入想要下载的文件: ')
tcp_client_socket.send(file_url.encode('utf-8'))
str0 = tcp_client_socket.recv(1024)
if str0.decode('utf-8') == '没有':
print('对不起,您输入的文件不存在!')
continue
else:
print('文件存在,开始下载...')
# 接收(---接收文件内容)
# str1 = tcp_client_socket.recv(1024)
# print(str1.decode('utf-8'))
# print(type(str1.decode('utf-8')))
# 创建文件,并输入内容
try:
with open(file_url, 'wb') as file:
while True:
str1 = tcp_client_socket.recv(1024)
# 判断:
if len(str1) == 0:
print('下载完毕')
break
else:
file.write(str1) # 二进制形式写入
except Exception as value:
print('文件下载出现异常: ' + value)
else:
break
tcp_client_socket.close()
二、服务端
import socket
import os
if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 解除端口占用
tcp_server_socket .setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
tuple1 = ('', 8800)
tcp_server_socket.bind(tuple1)
# 主动变被动套接字
tcp_server_socket.listen(32)
# 每次链接对应一个人
while True:
# 创建一个主动套接字,服务于当前链接的客户端socket
service_client_socket, ip_port = tcp_server_socket.accept()
recv_data = 0
while True:
recv_data = service_client_socket.recv(1024)
file_url = recv_data.decode('utf-8')
# 确定是否有此文件
# os.path.exists(文件路径) # True/False
if os.path.exists(file_url):
service_client_socket.send('有'.encode('utf-8'))
print(file_url + '文件存在!')
break
else:
service_client_socket.send('没有'.encode('utf-8'))
print('对方申请了一个不存在的文件!')
continue
# 打开文件,然后读取,最后通过死循环传递
with open(file_url, 'rb') as file:
# 死循环读取,并发送内容
while True:
# 判断,如果读不到了就跳出
file_data = file.read(1024)
print(file_url+'文件内容: ', file_data)
if file_data != b'':
service_client_socket.send(file_data) # 发送内容
else:
print('传输完毕')
break
# 关闭主动套接字
service_client_socket.close()
# 被动套接字不用关闭
# tcp_server_socket.close()