|
UDP通信
1 `( f/ `, b: x6 j数据报协议(自带报头)
: l3 A# ^( u/ I6 L没有双向通道 通信类似于发讯息
7 w- J- e8 P* [ g% m* f G' I( U& E0 C/ j; h! L
7 r5 T5 n! z5 z1.udp协议客户端允许发空; a4 Z, t* M0 y7 F( M
2.udp协议不会粘包
; C( L( M# _+ j" h7 b: n, j3.udp协议服务端不存在的情况下,客户端照样不会报错?
/ q: ?& J+ J7 p+ ]% q$ A) G4.udp协议支持并发 & \- s) \9 ?# U# a# T8 o/ `
UDP类似于发短信7 e" y* Q' v5 @2 n
TCP类似于打电话8 r- C; ?8 f4 l
z0 A! T) ?. e: g5 b4 D1 ]' I4 y并发:看起来像同时运行的
. p% ?* Z- l' t# ]7 I1 F" R3 ?并行:真正意义上的同时运行
7 N+ c! n( c- t0 V
- V" U4 d1 B5 O# i8 L& L {4 B; i- o) r5 _* j7 f v
udp 的基本使用
6 ^+ f5 p) ?/ A/ w. w客户端* C* f) z" E5 w( T t/ E* L9 F D
import socket
# i' @( A: s& }, P$ a! o `client = socket.socket(type=socket.SOCK_DGRAM)
7 _* X& g( n9 d" _* q C# 不需要建立连接 直接进入通信循环4 G. i' W. c- E6 J) W) P/ [, N4 j. v
server_address = ('192.168.13.8',8080)
- o; w8 ~: B# j) h% ewhile True:1 q0 W1 p2 G8 b
client.sendto(b'hello',server_address)
% g7 Y7 W2 Y6 d% \8 ]) Q data, addr = client.recvfrom(1024)
0 {* R- z6 K8 E# v print('服务端发来的数据',data)
8 l3 t4 o# h0 P& d$ t7 ? print('服务端的地址',addr)
8 X0 Z% A5 T E( K+ t H3 c: u0 O# o4 q3 Y* w
服务端
* a3 W/ a2 n) L# q, l9 }! Limport socket( ], A G2 P2 w9 K2 U! \9 q
server = socket.socket(type=socket.SOCK_DGRAM) # UDP协议# l- ?/ m3 P) ^4 w
server.bind(('192.168.13.8',8080))
! |% ~. @& C% {9 w7 B- x# UDP不需要设置半连接池 它也没有半连接池的概念
& F+ Q; R; g9 D7 P6 h6 P# |, [# 因为没有双向通道 不需要accept 直接就是通信循环+ @1 v$ ]3 w7 w4 w1 u+ M
while True:
/ J, h$ B- p* V data, addr = server.recvfrom(1024)( c& ^ y' U- b: i
print('数据:',data) # 客户端发来的消息. p2 C* L% \0 H- @4 I f7 v0 s6 P
print('地址:',addr) # 客户端的地址
5 `4 y6 A" z1 f, {' x* O server.sendto(data.upper(),addr)
: k/ u* S' K( }1 Z& t) Lsocketserver模块
+ W5 ~1 k: q2 `& ?/ S6 P. @- d1 zimport socketserver( m, u1 l0 f; G7 K8 @; T4 U
class MyServer(socketserver.BaseRequestHandler):
% ]" W f- u G6 R& ^0 e6 m def handle(self):) I) U1 I2 X5 b5 i% ?" C
# print('来啦 老弟')/ X+ s* b$ y. W
while True:
- Z% \; L2 e3 [/ L data = self.request.recv(1024)
2 \* P7 j0 R2 }1 ~) ? print(self.client_address) # 客户端地址# e( u4 B) [6 p6 f5 S
print(data.decode('utf-8'))" M5 F, |7 R9 R( o$ Z
self.request.send(data.upper())
5 _* Z! a M* x* ]$ c% kif __name__ == '__main__':$ R9 ^, c9 h. T: b, Q
"""只要有客户端连接 会自动交给自定义类中的handle方法去处理"""; l. R8 |9 ?' N' K! X
server = socketserver.ThreadingTCPServer(('192.168.13.8',8080),MyServer) # 创建一个基于TCP的对象
- E- l$ \; h, W9 m server.serve_forever() # 启动该服务对象
6 Y) Z: y6 l' q, I% w5 e
, s% U V: r( F$ S. L; X 6 V! j7 x- a8 l' D; o8 f
) X) r# d6 \6 I) _; pimport socket
: E1 |4 a% N4 h0 |/ _3 `7 J4 f% {import time' T/ k9 [9 M- o% K" U5 d5 x
client = socket.socket(type=socket.SOCK_DGRAM)
9 g$ E, W( P& Y$ Yserver_address = ('192.168.13.8',8080)
) e3 L: F n+ c3 Z) g/ }5 A) d4 fwhile True:
% r# u0 O, A, E& e( @. t* l client.sendto(b'hello',server_address)
0 k; V; l! Q$ @4 D; [ data,addr = client.recvfrom(1024)
5 }4 m2 A: L( l! s. g( h print(data.decode('utf-8'),addr)* s. ^, X+ {6 e9 b3 S% W* {
time.sleep(1)% D& c' s6 c1 O! A3 F( D4 {& J/ Z
5 X( t* c! O* z5 W* o
3 A+ W- B$ }4 s- \5 ]8 Q6 w( P y# ^ |