马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
UDP通信 0 S0 U* E& d; @) m- D1 x- ?% S
数据报协议(自带报头) # \: r# V& y" X# w7 X: v: J
没有双向通道 通信类似于发讯息
; G: j) E4 v+ d; f7 V; D% ^/ k" V: t# H
, x/ b. s7 e& R1 {
1.udp协议客户端允许发空. d) I" s) o% l: R8 |2 ?
2.udp协议不会粘包# U, \$ Q" F/ b9 _4 J
3.udp协议服务端不存在的情况下,客户端照样不会报错?
/ Z5 ^& B5 G6 u( X' s4.udp协议支持并发
- u5 d! B) k# S7 \UDP类似于发短信$ Q9 ?6 {4 L7 ?5 y
TCP类似于打电话6 n6 s0 J8 G2 }
% q4 V0 P5 |3 P+ D" ]+ p" n3 R并发:看起来像同时运行的
4 i' n6 H" _$ n+ t; K并行:真正意义上的同时运行 9 }" `- \* @% Z+ M) v
' j1 L7 A! v, T/ s9 X
- K5 _3 L2 @# J( Eudp 的基本使用
+ t- J3 u4 n |6 ^- u: J, K. n2 i客户端* W2 c. |9 R9 \/ f9 b7 W
import socket
6 J* [0 ^. i7 m Pclient = socket.socket(type=socket.SOCK_DGRAM)9 M. @$ K" R( b1 [$ t
# 不需要建立连接 直接进入通信循环1 ^0 C) y9 C+ _5 e! ~7 u
server_address = ('192.168.13.8',8080)
: K+ x, ` R* qwhile True:
0 G; t" b9 Q b* Z# Z client.sendto(b'hello',server_address)
; O0 Y5 G$ c0 L: c8 u( d data, addr = client.recvfrom(1024) }: E( b' ]/ `* ]1 n& o' \
print('服务端发来的数据',data)& ^1 S! D! h% B; |9 n3 L
print('服务端的地址',addr)) A- b- v& E4 M( k# Y
/ T/ a4 G* b6 K! D t: g服务端
0 C" y8 T# M/ [4 J& mimport socket
5 q1 O8 X- \4 [7 j Jserver = socket.socket(type=socket.SOCK_DGRAM) # UDP协议8 L. R" w; M. P! V4 j& B
server.bind(('192.168.13.8',8080))
3 Z1 W+ r! G" J% f2 w" ~6 X' b# t$ G# UDP不需要设置半连接池 它也没有半连接池的概念" Z- S( h( U# E9 \+ g: W: V; L
# 因为没有双向通道 不需要accept 直接就是通信循环. }# L% ^1 r1 K7 M
while True:
. O. ~3 X+ ]$ z/ D( W/ P- e data, addr = server.recvfrom(1024)9 d. ]/ J/ z4 d- F3 J0 d+ v
print('数据:',data) # 客户端发来的消息
* T, ]5 I, ?9 n, F print('地址:',addr) # 客户端的地址! E5 U% _& l0 E" e0 ~7 y0 m6 i2 y l" z
server.sendto(data.upper(),addr)
4 b3 q, {* l" Q+ M. [3 fsocketserver模块- ~$ \2 z3 {2 c: h1 O, G2 ~
import socketserver
3 Q! M7 z. A' m, g N% ^4 H, Zclass MyServer(socketserver.BaseRequestHandler):/ B+ ^! k6 T/ {6 u( C8 j9 X, i
def handle(self):
% A7 a" _" f2 {/ c# V # print('来啦 老弟')
% _6 \) r# L, a% ]! f0 d0 S while True:
( N, p; L. Y+ t Q B n g data = self.request.recv(1024)
0 \4 X5 n1 T$ {* P; P2 { print(self.client_address) # 客户端地址: `7 y6 y7 t7 s6 v8 N
print(data.decode('utf-8'))3 i& u4 N# B" \8 s& p
self.request.send(data.upper())
- [, Q6 ~9 K( p& b4 t# E" [5 Sif __name__ == '__main__':* b! z) ?5 j" @' C
"""只要有客户端连接 会自动交给自定义类中的handle方法去处理"""
7 m, _& ?2 \; z0 r server = socketserver.ThreadingTCPServer(('192.168.13.8',8080),MyServer) # 创建一个基于TCP的对象
* _) y ]( L x/ K, C( w5 |2 `, J, b server.serve_forever() # 启动该服务对象: w5 |0 S: v- Z8 |# o0 R/ a: V6 O( B
4 ]1 ]8 K+ M( p, Z' e8 S: I2 k6 r 3 Z/ E4 l3 A0 O& _# n
* G+ u0 }# V' \: Z
import socket) h% {1 F" e3 D
import time
& N2 Z, A4 ^6 J- K. g; E( ^client = socket.socket(type=socket.SOCK_DGRAM)& F k a5 Q. j+ _9 K
server_address = ('192.168.13.8',8080)( h' r. v- Y- Y" C5 x9 y+ A3 w- q o
while True:
" T* P9 V! q. H$ I4 n client.sendto(b'hello',server_address)
! ~7 r2 |8 j7 o" U8 o. e; j data,addr = client.recvfrom(1024). Y& M# C) F4 u) P- ^
print(data.decode('utf-8'),addr), K8 c4 Q& `- {/ D# Y
time.sleep(1)
8 I8 L+ a9 [8 z5 \) I2 M8 e' S. K6 F
) k: w# H- f1 n y" t; k+ A7 I# ~
# ]& e$ s$ ]! c) w( q |