赞
踩
操作文件和 socket 编程在平时也是必不可少的,这里介绍了 Python3 相关内容,做一个备忘。
Linux 中的 socket :
open() –> write/read –> close()
模式来操作,socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(读/写IO、打开、关闭);Python 中 socket 函数接口相关:
bind()
绑定地址时,在 AF_UNIX 下是文件名的形式,在 AF_INET 下是(host,port)的形式listen()
开始监听绑定的地址,参数含义:在拒绝连接之前,可以挂起的最大连接数量send()
发送数据recv()
接收数据C/S 模型示例
# Server 端 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # 创建套接字对象 sockName = "/tmp/UNIX.motion.server.d" if os.path.exists(sockName): os.unlink(sockName) s.bind(sockName) # 绑定地址 s.listen(5) # 开始监听 conn, address = s.accept() # 被动接受客户端连接,阻塞式等待连接的到来 data = 'hello world' conn.send(bytes(data, "utf-8")) # 数据交换 conn.close() s.close() # Client 端 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # 创建套接字对象 s.connect("/tmp/UNIX.motion.server.d") # 发送连接请求 data = s.recv(500) # 数据交换 s.close()
## 服务端 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) # 生成 SSL 上下文 context.load_cert_chain('cert/server.crt', 'cert/server_rsa_private.pem.unsecure') # 加载服务器所用证书和私钥 with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock: # 监听端口 sock.bind(('127.0.0.1', 9443)) sock.listen(5) # 将 socket 打包成 SSL socket with context.wrap_socket(sock, server_side=True) as ssock: while True: # 接收客户端连接 client_socket, addr = ssock.accept() # 接收客户端信息 msg = client_socket.recv(1024).decode("utf-8") print(f"receive msg from client {addr}:{msg}") # 向客户端发送信息 msg = f"yes , you have client_socketect with server.\r\n".encode("utf-8") client_socket.send(msg) client_socket.close() ## 客户端 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 生成 SSL 上下文 context.load_verify_locations('cert/ca.crt') # 加载信任根证书 with socket.create_connection(('127.0.0.1', 9443)) as sock: # 与服务端建立 socket 连接 # 将 socket 打包成 SSL socket # 一定要注意的是这里的server_hostname不是指服务端IP,而是指服务端证书中设置的CN with context.wrap_socket(sock, server_hostname='127.0.0.1') as ssock: # 向服务端发送信息 msg = "do i connect with server ?".encode("utf-8") ssock.send(msg) # 接收服务端返回的信息 msg = ssock.recv(1024).decode("utf-8") print(f"receive msg from server : {msg}") ssock.close()
本文只讨论 Python 的文件和流操作,不讨论系统相关的目录操作。
open()
,打开文件,文件指针的位置和打开时的读写模式有关.close()
,关闭文件,释放文件句柄,建议使用 with
操作.write()
,以当前文件指针,向文件写数据.read()
,以当前文件指针,从文件读数据.readline()
,以当前文件指针,从文件读一行文本.tell()
,显示当前指针位置.seek()
,移动指针位置w
以写方式打开W
文件若存在,首先要清空,然后(重新)创建a
以追加模式打开 (从 EOF 开始, 必要时创建新文件)r+
以读写模式打开w+
以写读模式打开 (参见 w )a+
以读写模式打开 (参见 a )rb
以二进制读模式打开wb
以二进制写模式打开 (参见 w )ab
以二进制追加模式打开 (参见 a )rb+
以二进制读写模式打开 (参见 r+ )wb+
以二进制读写模式打开 (参见 w+ )ab+
以二进制读写模式打开 (参见 a+ )w
打开文件写入,也会清空文件,如果使用read(),则报错;a 打开文件添加,数据流添加到文件末尾,而不是w模式的清空后,添加到文件末尾。b
可以附加到上述的字母后,形成rb
, rb+
, wb
等等模式,针对二进制文件,比如exe, elf, jpeg格式的文件,进行文件操作; 在unix 类型的系统上,text格式与二进制的处理相同,但是非unix类型的系统上,换行格式不同,所以需要用加b模式来在指定是否是二进制。
io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O 类型分别为: 文本 I/O, 二进制 I/O 和原始 I/O。这些是泛型类型,有很多种后端存储可以用在他们上面。一个隶属于任何这些类型的具 体对象被称作 file object。其他同类的术语还有 流和 类文件对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。