将套接字流重定向到标准输入或输出流
#!/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: %Sn' %(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:%sn' %(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()