ストリームリダイレクトユーティリティ


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内蔵関数を書き込むことができれば、文字モードファイルのカプセル化が必要です.しかし、ほとんどの場合、元のソケットを直接処理する場合、テキストは手動でバイト文字列に符号化する必要があります.