將套接字流重定向到標(biāo)準(zhǔn)輸入或輸出流
#!/usr/bin/env python3 """ 測試socket-stream 重定向模式 """ import sys,os,time from multiprocessing import Process from socket import * def initListenerSocket(port=50008,host=''): """ 初始化在服務(wù)器模式下調(diào)用者用于監(jiān)聽連接的套接字 """ 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'): """ 在接受之前其他連接都失敗,連接調(diào)用者標(biāo)準(zhǔn)輸出流 到一個(gè)套接字,這個(gè)套接字用于gui監(jiān)聽,在收聽者啟動后,啟動調(diào)用者 """ 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'): """ 連接調(diào)用者標(biāo)準(zhǔn)輸入流到用于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'): """ 在這種模式下,連接調(diào)用者標(biāo)準(zhǔn)輸入和輸出流到相同的套接字 調(diào)用者對于服務(wù)器來說就是客戶端:發(fā)送消息,接受響應(yīng)答復(fù) """ 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'): """ 在這種模式下,連接調(diào)用者標(biāo)準(zhǔn)輸入和輸出流到相同的套接字,調(diào)用者對于 服務(wù)器來說就是服務(wù)端:接受消息,發(fā)送響應(yīng)答復(fù) """ 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()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
