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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<code>一、socket子產品</code>
<code> </code><code>socket子產品提供了底層的接口,通過socket子產品可以實作不同計算機的通信</code>
<code> </code><code>ip</code><code>+</code><code>port定位了計算機中應用程式的具體位置,socket綁定ip</code><code>+</code><code>port來建立連結,socket的方法詳情:</code>
<code> </code><code>socket(family, </code><code>type</code><code>, proto): socket函數建立一個socket對象,使用socket對象建立連接配接,</code>
<code> </code><code>family協定族,預設AF_INET,ipv4協定,</code><code>type</code><code>,socket類型,proto協定類型</code>
<code> </code>
<code> </code><code>bind((ip, port)): 綁定伺服器位址</code>
<code> </code><code>listen(n): 監聽socket建立的連結, n代表指定連接配接隊列數,</code>
<code> </code><code>connect((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>)): 連接配接到服務端</code>
<code> </code><code>accept():等待用戶端連接配接,傳回連接配接對象和用戶端ip組成的元組</code>
<code> </code><code>recv(n): 接收資料,n代表接受固定的資料</code>
<code> </code><code>send(data): 發送資料</code>
<code> </code><code>例子:模拟用戶端服務端通信</code>
<code> </code><code>server:</code>
<code> </code><code>#!/usr/bin/python</code>
<code> </code><code># --*-- coding: utf-8 --*--</code>
<code> </code><code>import</code> <code>socket</code>
<code> </code><code>phone </code><code>=</code> <code>socket.socket(socket.AF_INET, socket.SOCK_STREAM)</code>
<code> </code><code>phone.bind((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>phone.listen(</code><code>5</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'starting...'</code><code>)</code>
<code> </code><code>conn, addr </code><code>=</code> <code>phone.accept()</code>
<code> </code><code>print</code><code>(conn)</code>
<code> </code><code>print</code><code>(</code><code>'client addr: '</code><code>, addr)</code>
<code> </code><code>print</code><code>(</code><code>'ready to read msg'</code><code>)</code>
<code> </code><code>client_msg </code><code>=</code> <code>conn.recv(</code><code>1024</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'client msg: %s'</code> <code>%</code><code>(client_msg))</code>
<code> </code><code>conn.send(client_msg.upper())</code>
<code> </code><code>conn.close()</code>
<code> </code><code>phone.close()</code>
<code> </code><code>client</code>
<code> </code><code>#!/usr/bin/pytthon</code>
<code> </code><code>phone.connect((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>phone.send(</code><code>'hello'</code><code>.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>back_msg </code><code>=</code> <code>phone.recv(</code><code>1024</code><code>)</code>
<code> </code><code>print</code><code>(back_msg.decode(</code><code>'gbk'</code><code>))</code>
<code> </code><code>模拟循環發送接收資料</code>
<code> </code><code>server</code>
<code> </code><code>while</code> <code>True</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>'starting...'</code><code>)</code>
<code> </code><code>conn, addr </code><code>=</code> <code>phone.accept()</code>
<code> </code><code>print</code><code>(</code><code>'client addr '</code><code>, addr)</code>
<code> </code><code>while</code> <code>True</code><code>:</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>client_msg </code><code>=</code> <code>conn.recv(</code><code>1024</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>client_msg: </code><code>break</code>
<code> </code><code>print</code><code>(</code><code>'client_msg: %s'</code> <code>%</code><code>client_msg)</code>
<code> </code><code>conn.send(client_msg.upper())</code>
<code> </code><code>except</code> <code>Exception:</code>
<code> </code><code>break</code>
<code> </code><code>conn.close()</code>
<code> </code><code>msg </code><code>=</code> <code>input</code><code>(</code><code>">>: "</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>msg: </code><code>continue</code>
<code> </code><code>phone.send(msg.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>back_msg </code><code>=</code> <code>phone.recv(</code><code>1024</code><code>)</code>
<code> </code><code>print</code><code>(back_msg.decode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>模拟遠端執行指令,并傳回結果</code>
<code> </code><code>import</code> <code>subprocess</code>
<code> </code><code>conn,addr </code><code>=</code> <code>phone.accept()</code>
<code> </code><code>print</code><code>(</code><code>'client addr: '</code><code>, addr)</code>
<code> </code><code>cmd </code><code>=</code> <code>conn.recv(</code><code>1024</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>cmd: </code><code>break</code>
<code> </code><code>res </code><code>=</code> <code>subprocess.Popen(cmd.decode(</code><code>'utf-8'</code><code>), shell</code><code>=</code><code>True</code><code>, stdout</code><code>=</code><code>subprocess.PIPE, stderr</code><code>=</code><code>subprocess.PIPE)</code>
<code> </code><code>err </code><code>=</code> <code>res.stderr.read()</code>
<code> </code><code>if</code> <code>err:</code>
<code> </code><code>cmd_res </code><code>=</code> <code>err</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>cmd_res </code><code>=</code> <code>res.stdout.read()</code>
<code> </code><code>conn.send(cmd_res)</code>
<code> </code><code>cmd </code><code>=</code> <code>input</code><code>(</code><code>'>>: '</code><code>).strip()</code>
<code> </code><code>if</code> <code>not</code> <code>cmd: </code><code>continue</code>
<code> </code><code>phone.send(cmd.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>print</code><code>(back_msg.decode(</code><code>'gbk'</code><code>))</code>
<code> </code><code>粘包現象,資料包無規則斷開,出現不希望的斷開現象</code>
<code> </code><code>from</code> <code>socket </code><code>import</code> <code>*</code>
<code> </code><code>import</code> <code>time</code>
<code> </code><code>tcp_server </code><code>=</code> <code>socket(AF_INET, SOCK_STREAM)</code>
<code> </code><code>tcp_server.bind((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>tcp_server.listen(</code><code>5</code><code>)</code>
<code> </code><code>conn, addr </code><code>=</code> <code>tcp_server.accept()</code>
<code> </code><code>res1 </code><code>=</code> <code>conn.recv(</code><code>5</code><code>)</code>
<code> </code><code>res2 </code><code>=</code> <code>conn.recv(</code><code>5</code><code>)</code>
<code> </code><code>res3 </code><code>=</code> <code>conn.recv(</code><code>7</code><code>)</code>
<code> </code><code>print</code><code>(res1.decode(</code><code>'gbk'</code><code>))</code>
<code> </code><code>print</code><code>(res2.decode(</code><code>'gbk'</code><code>))</code>
<code> </code><code>print</code><code>(res3.decode(</code><code>'gbk'</code><code>))</code>
<code> </code><code>tcp_client </code><code>=</code> <code>socket(AF_INET, SOCK_STREAM)</code>
<code> </code><code>tcp_client.connect((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>tcp_client.send(</code><code>'hello world'</code><code>.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>time.sleep(</code><code>5</code><code>)</code>
<code> </code><code>tcp_client.send(</code><code>'egon666'</code><code>.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>解決粘包問題,使用struct子產品,打包資料并解包資料</code>
<code> </code><code>例子:</code>
<code> </code><code>import</code> <code>socket</code>
<code> </code><code>import</code> <code>subprocess</code>
<code> </code><code>import</code> <code>struct</code>
<code> </code><code>import</code> <code>json</code>
<code> </code>
<code> </code><code>phone </code><code>=</code> <code>socket.socket(socket.AF_INET,socket.SOCK_STREAM)</code>
<code> </code><code>phone.bind((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>phone.listen(</code><code>5</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'starting...'</code><code>)</code>
<code> </code><code>conn, addr </code><code>=</code> <code>phone.accept()</code>
<code> </code><code>print</code><code>(</code><code>'client addr: '</code><code>, addr)</code>
<code> </code><code>while</code> <code>True</code><code>:</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>cmd </code><code>=</code> <code>conn.recv(</code><code>1024</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>cmd:</code><code>break</code>
<code> </code><code>res </code><code>=</code> <code>subprocess.Popen(cmd.decode(</code><code>'utf-8'</code><code>), shell</code><code>=</code><code>True</code><code>, stdout</code><code>=</code><code>subprocess.PIPE, stderr</code><code>=</code><code>subprocess.PIPE)</code>
<code> </code><code>err </code><code>=</code> <code>res.stderr.read()</code>
<code> </code><code>if</code> <code>err:</code>
<code> </code><code>cmd_res </code><code>=</code> <code>err</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>cmd_res </code><code>=</code> <code>res.stdout.read()</code>
<code> </code><code>head_dict </code><code>=</code> <code>{</code><code>'filename'</code><code>: </code><code>None</code><code>, </code><code>'hash'</code><code>: </code><code>None</code><code>, </code><code>'total_size'</code><code>: </code><code>len</code><code>(cmd_res)}</code>
<code> </code><code>head_json </code><code>=</code> <code>json.dumps(head_dict)</code>
<code> </code><code>head_bytes </code><code>=</code> <code>head_json.encode(</code><code>'utf-8'</code><code>)</code>
<code> </code><code>print</code><code>(struct.pack(</code><code>'i'</code><code>, </code><code>len</code><code>(head_bytes)))</code>
<code> </code><code>conn.send(struct.pack(</code><code>'i'</code><code>, </code><code>len</code><code>(head_bytes)))</code>
<code> </code><code>conn.send(head_bytes)</code>
<code> </code><code>conn.send(cmd_res)</code>
<code> </code><code>except</code> <code>Exception:</code>
<code> </code><code>break</code>
<code> </code><code>conn.close()</code>
<code> </code><code>phone.close()</code>
<code> </code><code>client</code>
<code> </code><code>phone </code><code>=</code> <code>socket.socket(socket.AF_INET, socket.SOCK_STREAM)</code>
<code> </code><code>phone.connect((</code><code>'127.0.0.1'</code><code>, </code><code>8080</code><code>))</code>
<code> </code><code>cmd </code><code>=</code> <code>input</code><code>(</code><code>'>>: '</code><code>).strip()</code>
<code> </code><code>if</code> <code>not</code> <code>cmd: </code><code>continue</code>
<code> </code><code>phone.send(cmd.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>head_struct </code><code>=</code> <code>phone.recv(</code><code>4</code><code>)</code>
<code> </code><code>#print(head_struct)</code>
<code> </code><code>head_len </code><code>=</code> <code>struct.unpack(</code><code>'i'</code><code>, head_struct)[</code><code>0</code><code>]</code>
<code> </code><code>head_bytes </code><code>=</code> <code>phone.recv(head_len)</code>
<code> </code><code>head_json </code><code>=</code> <code>head_bytes.decode(</code><code>'utf-8'</code><code>)</code>
<code> </code><code>#print(head_json)</code>
<code> </code><code>head_dict </code><code>=</code> <code>json.loads(head_json)</code>
<code> </code><code>#print(head_dict)</code>
<code> </code><code>total_size </code><code>=</code> <code>head_dict[</code><code>'total_size'</code><code>]</code>
<code> </code><code>recv_size </code><code>=</code> <code>0</code>
<code> </code><code>data </code><code>=</code> <code>b''</code>
<code> </code><code>while</code> <code>recv_size < total_size:</code>
<code> </code><code>recv_data </code><code>=</code> <code>phone.recv(</code><code>1024</code><code>)</code>
<code> </code><code>data </code><code>+</code><code>=</code> <code>recv_data</code>
<code> </code><code>recv_size </code><code>+</code><code>=</code> <code>len</code><code>(recv_data)</code>
<code> </code><code>print</code><code>(data.decode(</code><code>'gbk'</code><code>))</code>
本文轉自小白的希望 51CTO部落格,原文連結:http://blog.51cto.com/haoyonghui/1939996,如需轉載請自行聯系原作者