上一篇提到的问题有一点儿误解,其实真正的问题有2个:
问题一: 服务器端接收了1024个字节之后就进入下一次循环,等待下一次连接去了.而不处理1024字节之后的文件内容.导致接收不全.
问题二: 把quit当做文件内容进行保存了,解决办法 可以添加确认信息到两端,每发送1024字节等待对方确认成功,否则其他信息就是完结了.最后再发送一个quit指令关闭.
理解还是不到位,哪位大神欢迎指出症结.
服务器端:
import socket
# 实例化
sk = socket.socket()
ip_port = ('127.0.0.1', 9999)
#绑定
sk.bind(ip_port)
#监听
sk.listen(5)
while True:
conn, address = sk.accept()
# 当连进来之后,就一直使用当前连接进行数据发送
# 直到结束标志出现
while True:
with open("file_bak", "ab") as f:
data = conn.recv(1024)
print(data.decode())
if data == b"quit":
break
f.write(data)
# 接收完成标志
conn.send('success'.encode())
# 打印提示信息
print('文件接收完成')
print('正在关闭服务...')
sk.close()
客户端:
import socket
# 实例化
import time
sk = socket.socket()
# ip和端口
ip_port = ('127.0.0.1',9999)
#连接
sk.connect(ip_port)
# 文件上传
# 打开文件
with open('file_1', 'rb') as f:
# 数据分割
for i in f:
# 上传
sk.send(i)
# 等待接收完成
data = sk.recv(1024)
print(data)
# 判断服务器端是否接收并写入
if data != b'success':
break
sk.send('quit'.encode())
print('已发送关闭指令')