为了账号安全,请及时绑定邮箱和手机立即绑定

老师这个程序的逻辑个人感觉有点瑕疵

1、首先一个问题就是,为什么文件的发送完成与否要由接收端来告知发送端呢?既然文件是分段发送的,接收端怎么知道到底有多少段呢,他只能一直接收。发送端里的for循环不是一个死循环,当文件读取并发送完成的时候,便会结束循环,这个时候才是一个正确的向接收端发送quit结束信号的时机,接收端收到quit,结束内层while死循环,然后这个时候接收端才知道文件已经接收完成了,接着打印接收完成提示信息。发送端程序结束,接收端程序进入下一次外层while循环,继续等待客户端的连接重复上述过程

2、个人感觉接收端内层的while死循环应该放在with语句块里会更合适吧,打开一次文件,然后持续的进行数据的接收和文件的写入

改动了一下老师的程序:

发送端:

# 导入模块
import socket
if __name__ == '__main__':
    # 实例化模块
    sk = socket.socket()
    # 定义连接ip和port
    ip_port = ('127.0.0.1', 9999)
    # 服务器连接
    sk.connect(ip_port)
    # 文件上传
    # 打开文件
    with open('socket_server_tcp.py', 'rb') as file:
        # 分块上传
        for f in file:
            # 数据上传
            sk.send(f)
    # 给服务器端发送结束信号
    sk.send('quit'.encode())
    pass

接收端:

# 导入模块
import socket
if __name__ == '__main__':
    # 实例化
    sk = socket.socket()
    # 定义连接ip和port
    ip_port = ('127.0.0.1', 9999)
    # 绑定ip和port
    sk.bind(ip_port)
    # 最大连接数
    sk.listen(5)
    # 进入循环接收数据
    while True:
        # 等待客户端连接
        conn, address = sk.accept()
        # 打开文件等待数据写入
        with open('file', 'ab') as file:
            # 一直使用当前连接进行数据接收,直到结束标志出现
            while True:
                # 接收数据
                data = conn.recv(1024)
                if data == b'quit':
                    break
                # 写入文件
                file.write(data)
        # 打印提示信息
        print('文件接收完成!')
    pass


正在回答

1 回答

有自己的想法不错,同学

0 回复 有任何疑惑可以回复我~

你说得不错,分析得很好

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

老师这个程序的逻辑个人感觉有点瑕疵

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信