为了说明makefile方法的操作,下面的代码实现了多种重定向方案,其把调用者流重定向到一个用于另一个会话进程的套接字上。它的第一个函数和输出相连。当然,由socket.makefile返回的封装对象,也可以与直接文件接口的read和write方法调用和独立的标准流一起使用。
__author__ = 'JianqingJiang'
# -*- coding: utf-8 -*-
#用于连接非GUI程序的标准流到套接字的工具,一个GUI(或其他)程序可以使用这个与非GUI程序进行交互
import sys
from socket import *
port = 50008
host = 'localhost'
def initListenerSocket(port=port):
#初始化在服务器模式下调用者用于监听的连接套接字
sock = socket(AF_INET,SOCK_STREAM)
sock.bind(('',port))
sock.listen(5)
conn,addr = sock.accept()
return conn
def redirectOut(port=port,host=host):
#在接收之前其他连接失败,连接调用者标准输出流到一个套接字,这个套接字用于GUI监听,在收到者启动后,启动调用者
sock = socket(AF_INET,SOCK_STREAM)
sock.connect((host,port))
file = sock.makefile('w')
sys.stdout = file
return sock
def redirectIn(port=port,host=host):
#连接调用者标准输入流到用于GUI来提供功能的套接字
sock = socket(AF_INET,SOCK_STREAM)
sock.connect((host,port))
file = sock.makefile('r')
sys.stdin = file
return sock
def 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 sock
def 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内置函数,可以获得,那么就需要文字模式文件封装。然而,在大多数情况中,直接处理原始套接字时,文本仍需手动编码为字节字符串。