本文共 1693 字,大约阅读时间需要 5 分钟。
为了说明makefile方法的操作,下面的代码实现了多种重定向方案,其把调用者流重定向到一个用于另一个会话进程的套接字上。它的第一个函数和输出相连。当然,由socket.makefile返回的封装对象,也可以与直接文件接口的read和write方法调用和独立的标准流一起使用。
__author__ = 'JianqingJiang'# -*- coding: utf-8 -*-#用于连接非GUI程序的标准流到套接字的工具,一个GUI(或其他)程序可以使用这个与非GUI程序进行交互import sysfrom socket import *port = 50008host = 'localhost'def initListenerSocket(port=port): #初始化在服务器模式下调用者用于监听的连接套接字 sock = socket(AF_INET,SOCK_STREAM) sock.bind(('',port)) sock.listen(5) conn,addr = sock.accept() return conndef redirectOut(port=port,host=host): #在接收之前其他连接失败,连接调用者标准输出流到一个套接字,这个套接字用于GUI监听,在收到者启动后,启动调用者 sock = socket(AF_INET,SOCK_STREAM) sock.connect((host,port)) file = sock.makefile('w') sys.stdout = file return sockdef redirectIn(port=port,host=host): #连接调用者标准输入流到用于GUI来提供功能的套接字 sock = socket(AF_INET,SOCK_STREAM) sock.connect((host,port)) file = sock.makefile('r') sys.stdin = file return sockdef redirectBothAsClient(port=port,host=host): #在这种模式下,连接调用者标准输入和输出流到相同的套接字,调用者对于服务器来说就是客户端:发送消息,接受响应答复 sock = socket(AF_INET,SOCK_STREAM) sock.connect((host,port)) ofile = sock.makefile('w') iflie = sock.makefile('r') sys.stdout = ofile sys.stdin = iflie return sockdef redirectBothAsServer(port=port,host=host): #在这种模式下,连接调用者标准输入和输出流到相同的套接字,调用者对于客户端来说就是服务器:接受消息,发送响应答复 sock = socket(AF_INET,SOCK_STREAM) sock.bind(('',port)) sock.listen(5) conn,addr = sock.accept() ofile = sock.makefile('w') iflie = sock.makefile('r') sys.stdout = ofile sys.stdin = iflie return conn
原始套接字可以传输二进制字节字符串,但是在文本模式下打开封装文件,它们的内容在输入和输出时会自动转换成文本字符串。如果通过标准流工具,如可以写入文本字符串print内置函数,可以获得,那么就需要文字模式文件封装。然而,在大多数情况中,直接处理原始套接字时,文本仍需手动编码为字节字符串。
转载地址:http://nknqi.baihongyu.com/