一、什么是下载&with语句
- 下载: 从服务器Down一个文件。其具体流程是这样的
- 客户端发送下载的请求(包含要下载的文件唯一标识,比如文件名等)
- 服务器接收请求,在文件库中查找同名文件,发送(以二进制码流形式)数据流
- 客户端新建一个同名的文件,然后将数据流写入这个文件
- 客户端保存文件
- 下面两个代码的效果是相同的,也就是说:with语句可以避免读取写入报错。但是不可避免打开报错(文件不存在时读取),从代码结构就可看出。
f = open(“xxx”)
try:
f.read()/write()
except:
f.close()
with open(“xxx”) as f:
f.read()/write()
- 下面我们从简单的客户端开始
二、客户端
- 客户端的职责有:
- 发送文件名
- 新建文件
- 接收二进制数据,并写入,然后保存
1)接收二进制类客户端
- 让网络调试助手当服务器。用程序发送文件名(扩展名我乱写的),然后网络调试助手收到文件名,发送数据(这里我们假装服务器打开了文件,直接发送数据过去)
- 出现乱码是因为,这里是二进制文件,拿文本查看器肯定会乱码(如果是发送一字节的英文,是不会乱码的)当然,这里转码没有必要,因为发送接收都是二进制,而且转码很容易报错。同样在Linux系统中,通过程序互发,是不会乱码的。
2)接收文本类客户端
- 只要把写入文件那些代码改了就行(原理就是先转码,再写入),写入部分的代码如下:
- 运行效果如下(网络调试助手和上面的做法一致)
三、服务器
- 服务器的职责:
- 接收要下载的文件名
- 打开相应文件,读取里面的内容,并发送
- 如果文件名不存在要提醒
- 自己试下,把接收发送封装在一个函数内。(之后学习多任务要用到)
四、 两个程序相互连接
- 拿写好的服务器和客户端相互连接(记得改ip和端口):