12.27 网络编程作业笔记
2022/1/1 11:10:31
本文主要是介绍12.27 网络编程作业笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
单线程服务器、多线程服务器、异步服务器,三种架构实现大文件的发送和接收。
现在有单线程服务器的echo功能完成,试试看先把文件的读写功能做出来
python文件读写
生成发送的文件(用来测试文件写入功能)
path = './send/file2.txt' write_file = open(path,'w') write_string = '' for i in range(10000): write_string = write_string + str(i) if(i % 10 == 0): write_string = write_string + '\n' write_file.write(write_string) write_file.close()
注意:
1.文件路径,如果是在当前目录下的,记得路径开始的那个’.'别忘了
2.open文件的模式为‘w’,意思是先清空文件再写入,对于已经有内容的文件来说,这个操作是很危险的,注意小心
path = './send/file2.txt' write_file = open(path,'w') write_string = '' for i in range(100000000): write_string = write_string + str(i) if(len(write_string)>10000): write_file.write(write_string) write_string = '' write_file.write(write_string) write_file.close()
变体:生成更大的文件,如果生成长字符串保留在内存中的话,运行会非常慢,可以选择生成一段字符就写入文件一段,然后清空刚才保存在内存中的字符串,这样可以防止内存被占满导致无法继续写入。这样创建的文件大约770MB
接收文件
def recv_and_write_until(sock,path): file = open(path,'w') message = sock.recv(4096) if not message: raise EOFError('socket closed') else: file.write(bytes_to_string(message)) if not message.endswith(SUFFIX): while True: data = sock.recv(4096) if not data: raise IOError('received {!r} then socket closed'.format(data)) if data.endswith(SUFFIX): file.write(bytes_to_string(data)) break else: file.write(bytes_to_string(data)) file.close()
同理,接收大文件的时候不能一次性全部收齐再写入,应该每收到一段就写入一次
发送文件
def send_all_file(sock, path): MAX_LENGTH = 4000 file = open(path,'r') while True: block = file.read(MAX_LENGTH) if not block: sock.sendall(SUFFIX) break sock.sendall(block.encode('UTF-8'))
python 的read方法可以直接设置read多长(应该是多少个字节?)
看到有一种方法是用for line in file: 不过没试。测试的大文件包括整个文件只有一行的,不能用readline读,那样也会内存不够
到这里的话,文件读写工作算是完成了,可以用单线程服务器发送770MB大小的文件,下午来看不同的服务器架构
这篇关于12.27 网络编程作业笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程