天天看點

python學習之網絡程式設計

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>"&gt;&gt;: "</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>'&gt;&gt;: '</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>'&gt;&gt;: '</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 &lt; 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,如需轉載請自行聯系原作者