1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
#!/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() |
python套接字流重定向实例汇总
2020-08-15 12:03脚本之家 Python
套接字是一种具有之前所说的“通信端点”概念的计算网络数据结构。相当于电话插口,没它无法通信,这个比喻非常形象。今天我们就来汇总一下套接字流重定向的实例
延伸 · 阅读
- 2022-03-11用Python实现一个模仿UP主弹幕控制的直播间功能
- 2022-03-11Python实战之设计一个多功能办公小工具
- 2022-03-11Python数据分析之缺失值检测与处理详解
- 2022-03-11Python变量的作用域详解
- 2022-03-11Python之捕捉异常详解
- 2022-03-11Python进度条可视化之监测程序运行速度
- Python
python直接访问私有属性的简单方法
下面小编就为大家带来一篇python直接访问私有属性的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...
- Python
Python实现ping指定IP的示例
今天小编就为大家分享一篇Python实现ping指定IP的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
使用NumPy和pandas对CSV文件进行写操作的实例
今天小编就为大家分享一篇使用NumPy和pandas对CSV文件进行写操作的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
在本篇内容里小编给大家分享的是关于Python3以GitHub为例来实现模拟登录和爬取的实例讲解,需要的朋友们可以参考下。 ...
- Python
python 插入Null值数据到Postgresql的操作
这篇文章主要介绍了python 插入Null值数据到Postgresql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...
- Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
这篇文章主要介绍了在Windows系统上搭建Nginx+Python+MySQL环境的教程,文中使用flup中间件及FastCGI方式连接,需要的朋友可以参考下 ...
- Python
Python的dict字典结构操作方法学习笔记
这篇文章主要介绍了Python的dict字典结构操作方法学习笔记本,字典的操作是Python入门学习中的基础知识,需要的朋友可以参考下...
- Python
python 列表转为字典的两个小方法(小结)
这篇文章主要介绍了python 列表转为字典的两个小方法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...