python套接字流重定向实例汇总

828次阅读  |  发布于5年以前

将套接字流重定向到标准输入或输出流


    #!/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()

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8