|
UDP通信
( f$ C8 e& F$ |0 i. Y: L$ K数据报协议(自带报头)
) Q8 I6 V/ `* ^9 U# v没有双向通道 通信类似于发讯息 8 x) V* X+ e, K5 m! r5 B
I7 z6 `7 U! W9 \ + z) B- m& B8 m
1.udp协议客户端允许发空
2 r B. @1 P% W2.udp协议不会粘包
; \; m$ t+ J+ P: E3 P d3.udp协议服务端不存在的情况下,客户端照样不会报错? h3 s8 H; a' L3 Y5 `2 h
4.udp协议支持并发 - p' c( g" d; G
UDP类似于发短信
2 ~4 C) D. q9 p7 b+ UTCP类似于打电话
& O% A" \- e' N1 H
4 d/ ]+ p9 l8 P( P) d# T; r并发:看起来像同时运行的
+ B4 [1 P& F$ `2 k并行:真正意义上的同时运行
/ k% V+ b, T/ w/ L' P3 ^9 U
8 i$ G: f* [! W2 I0 J& I
- ^5 F% L+ I# K6 v0 s# {udp 的基本使用
4 D9 \* S, C+ Z/ T/ x8 M客户端
* ?* o# J. b+ _( Gimport socket
: T( ?2 [/ x$ z7 `3 [; U; bclient = socket.socket(type=socket.SOCK_DGRAM)+ c; ]6 K$ `% ~: r3 j
# 不需要建立连接 直接进入通信循环
9 v, u( `8 U" e% M9 Zserver_address = ('192.168.13.8',8080)
/ [) F4 E. r6 u& ywhile True:) ^5 a2 }1 u# f4 A' {, V
client.sendto(b'hello',server_address)
: k2 R5 I7 j7 ]8 J$ }" d+ u3 [ data, addr = client.recvfrom(1024)% y3 c8 V3 H) X9 X8 n9 p/ {
print('服务端发来的数据',data)
, T7 j3 e' k2 c print('服务端的地址',addr)8 o3 V. Y* \6 m5 o6 a7 y
1 ^3 B) b" l3 p U
服务端
$ H( V9 M' j# C* v, ^, X" o1 G) simport socket
; t4 b4 x! _0 h# s- M5 M: }server = socket.socket(type=socket.SOCK_DGRAM) # UDP协议
1 J% p: d" B. ~2 Y Z; P5 Nserver.bind(('192.168.13.8',8080))
" y* P& x) y- B& U# UDP不需要设置半连接池 它也没有半连接池的概念
1 Q+ O% T3 E9 w# 因为没有双向通道 不需要accept 直接就是通信循环7 _5 p+ q% G1 f' \
while True:
- W( m4 V G$ Z data, addr = server.recvfrom(1024)+ N3 M8 s' L3 {2 @/ h* P2 f
print('数据:',data) # 客户端发来的消息) Q8 O6 X& g4 l/ H- m3 I( _
print('地址:',addr) # 客户端的地址' N0 R! R. N# Y* o
server.sendto(data.upper(),addr)% z E6 T1 y; Q% E# I+ n& h
socketserver模块
6 T( |7 }8 G; b9 a6 k& [import socketserver* r- J" Y# v! z% [
class MyServer(socketserver.BaseRequestHandler):
- }5 z k1 v7 b2 D0 Q+ b def handle(self):
! r0 a+ d: ~0 g7 i$ u # print('来啦 老弟')9 L0 x) _7 q$ a. c. p6 v! u
while True:3 h# z: M1 w9 {$ [& e" J
data = self.request.recv(1024)7 i k1 {: h; E
print(self.client_address) # 客户端地址
! r* ?( Y+ ?% J% P* v1 U$ X; s& V print(data.decode('utf-8'))
$ ^4 D/ ~2 b3 D3 x% F self.request.send(data.upper())
6 H" o! d/ O/ y" e# V- ~' I* Rif __name__ == '__main__':
0 e- t( B- q7 E """只要有客户端连接 会自动交给自定义类中的handle方法去处理"""6 R$ y9 Z$ x u& x- U7 U9 b: j
server = socketserver.ThreadingTCPServer(('192.168.13.8',8080),MyServer) # 创建一个基于TCP的对象
) t" ^) W0 }- i* s$ a server.serve_forever() # 启动该服务对象
( L; [1 ]( Q$ [, Z# i3 O% \) ` 7 }7 o5 f+ S% [, s( z; c9 x
3 N$ k3 X( l; b) d! M% R ~5 e: u. M
8 P: F P, I% r9 A( kimport socket" U" R4 g: g% X( i
import time$ H2 [, g+ ^ h8 K
client = socket.socket(type=socket.SOCK_DGRAM)
' n! J/ _8 r. X5 U' g7 ~+ ^server_address = ('192.168.13.8',8080). _( e. W" O5 n) k. `/ J7 N5 f S
while True:
' S- t- l4 T- M$ c& ]' i5 j client.sendto(b'hello',server_address)
4 d# B' R- Q$ \ data,addr = client.recvfrom(1024)& ]7 i2 l" x3 F5 V' ~3 r
print(data.decode('utf-8'),addr)2 ]& x" h6 R. D, F4 T! {
time.sleep(1). f1 `3 c& m* O* x
3 L" G3 g X: m8 V' r- r" s, M; s0 Z8 D4 D" I# P+ e6 F
|