将套接字流重定向到标准输入或输出流
#!/usr/bin/env python3 \"\"\" 测试socket-stream 重定向模式 \"\"\" import sys,os,time from multiprocessing import Process from socket import * def initListenerSocket(port=50008,host=\'\'): \"\"\" 初始化在服务器模式下调用者用于监听连接的套接字 \"\"\" sock=socket() try: sock.bind((host,port)) except OSError as e: print(\'Address already in use\') os._exit(1) sock.listen(5) conn,addr=sock.accept() return conn def redirecOut(port=50008,host=\'localhost\'): \"\"\" 在接受之前其他连接都失败,连接调用者标准输出流 到一个套接字,这个套接字用于gui监听,在收听者启动后,启动调用者 \"\"\" sock=socket() try: sock.connect((host,port)) except ConnectionRefusedError as e: print(\'connection refuse\') os._exit(1) file=sock.makefile(\'w\') sys.stdout=file return sock def redirecIn(port=50008,host=\'localhost\'): \"\"\" 连接调用者标准输入流到用于gui来提供的套接字 \"\"\" sock=socket() try: sock.connect((host,port)) except ConnectionRefusedError as e: print(\'conenction refuse\') os._exit(1) file=sock.makefile(\'r\') sys.stdin=file return sock def redirecBothAsClient(port=50008,host=\'localhost\'): \"\"\" 在这种模式下,连接调用者标准输入和输出流到相同的套接字 调用者对于服务器来说就是客户端:发送消息,接受响应答复 \"\"\" sock=socket() try: sock.connect((host,port)) except ConnectionRefusedError as e: print(\'connection refuse\') os._exit(1) ofile=sock.makefile(\'w\') ifile=sock.makefile(\'r\') sys.stdout=ofile sys.stdin=ifile return sock def redirecBothAsServer(port=50008,host=\'localhost\'): \"\"\" 在这种模式下,连接调用者标准输入和输出流到相同的套接字,调用者对于 服务器来说就是服务端:接受消息,发送响应答复 \"\"\" sock=socket() try: sock.bind((host,port)) except OSError as e: print(\'Address already in use\') os._exit(1) sock.listen(5) conn,addr=sock.accept() ofile=conn.makefile(\'w\') ifile=conn.makefile(\'r\') sys.stdout=ofile sys.stdin=ifile return conn def server1(): mypid=os.getpid() conn=initListenerSocket() file=conn.makefile(\'r\') for i in range(3): data=file.readline().rstrip() print(\'server %s got [%s]\' %(mypid,data)) def client1(): time.sleep(1) mypid=os.getpid() redirecOut() for i in range(3): print(\'client: %s:%s\' % (mypid,i)) sys.stdout.flush() def server2(): mypid=os.getpid() conn=initListenerSocket() for i in range(3): conn.send((\'server %s got [%s]\\n\' %(mypid,i)).encode()) def client2(): time.sleep(1) mypid=os.getpid() redirecIn() for i in range(3): data=input() print(\'client %s got [%s]]\'%(mypid,data)) def server3(): mypid=os.getpid() conn=initListenerSocket() file=conn.makefile(\'r\') for i in range(3): data=file.readline().rstrip() conn.send((\'server %s got [%s]\\n\' % (mypid,data)).encode()) def client3(): time.sleep(1) mypid=os.getpid() redirecBothAsClient() for i in range(3): print(\'Client %s: %s\' %(mypid,data)) data=input() sys.stderr.write(\'client %s got [%s]\\n\' %(mypid,data)) def server4(port=50008,host=\'localhost\'): mypid=os.getpid() sock=socket() try: sock.connect((host,port)) ConnectionRefusedError as e: print(\'connection refuse\') os._exit(1) file=sock.makefile(\'r\') for i in range(3): sock.send((\'server %s: %S\\n\' %(mypid,i)).encode()) data=file.readline().rstrip() print(\'server %s got [%s]\' %(mypid,data)) def client4(): time.sleep(1) mypid=os.getpid() redirecBothAsServer() for i in range(3): data=input() print(\'client %s got [%s]\'%(mypid,data)) sys.stdout.flush() def server5(): mypid=os.getpid() conn=initListenerSocket() file=conn.makefile(\'r\') for i in range(3): conn.send((\'server %s:%s\\n\' %(mypid,i)).encode()) data=file.readline().rstrip() print(\'server %s got [%s]\' % (mypid,data)) def client5(): mypid=os.getpid() s=redirecBothAsClient() for i in range(3): data=input() print(\'client %s got [%s]\'%(mypid,data)) sys.stdout.flush() def main(): server=eval(\'server\'+sys.argv[1]) client=eval(\'client\'+sys.argv[1]) Process(target=server).start() client() if __name__==\'__main__\': main()