马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
UDP通信 ( l6 Z# e- s7 L1 K
数据报协议(自带报头)
% F' A! F: _3 h2 I* W没有双向通道 通信类似于发讯息 5 ]% W& u; x% ^1 b8 H
' I' O; F" `0 n% M& O
' S/ N' n6 \1 c
1.udp协议客户端允许发空" o! ^) s0 r; z. p2 ~
2.udp协议不会粘包0 @! c! T9 O' L, H5 d( a6 `
3.udp协议服务端不存在的情况下,客户端照样不会报错?$ O3 j8 m% S5 b ?
4.udp协议支持并发
1 I0 o$ i0 U- A+ Q* C% lUDP类似于发短信
5 l" s" R( ]+ r/ P# j9 jTCP类似于打电话
9 u# K" x/ D2 Y0 ?
# n( {/ x0 t+ q0 |) Y并发:看起来像同时运行的
' F+ |2 f, _. U* G6 N, A并行:真正意义上的同时运行
# q8 G: C% W' |! ~3 O5 P2 E8 e! F* Y, ^5 k9 c0 Y
/ ]% e# o% v1 d& g7 |
udp 的基本使用
( n7 j& o; C. A8 r客户端% A( ?/ G; A5 |; c4 @
import socket
5 r: ^# B$ F; t, O4 wclient = socket.socket(type=socket.SOCK_DGRAM)
& s4 S+ z# m7 K4 N& I8 K# 不需要建立连接 直接进入通信循环
' d v2 |9 Q5 Z7 y: v! Bserver_address = ('192.168.13.8',8080)
6 n/ j* N+ c' V4 hwhile True:
0 F0 U s$ l; N9 w8 t$ K% d+ x# L client.sendto(b'hello',server_address)
/ [# R( B5 b$ `& E; g, T data, addr = client.recvfrom(1024)
7 H7 Q7 l2 d* G1 [" F print('服务端发来的数据',data)
7 B9 \! o& t1 R: i) R5 [& B print('服务端的地址',addr)) I w( }& X r ]. ^9 D% J
9 F% k) s8 l1 L2 T. |服务端
" ~# t% M4 J7 [1 limport socket
* {& H9 R$ P0 E4 |6 k5 Y I1 T, oserver = socket.socket(type=socket.SOCK_DGRAM) # UDP协议- z/ P) o( I2 g5 _. [5 l2 v# E1 B. Z
server.bind(('192.168.13.8',8080))+ T6 p. {! Y; m7 {- y, x
# UDP不需要设置半连接池 它也没有半连接池的概念4 i6 a4 o) _9 T$ Q9 M4 i
# 因为没有双向通道 不需要accept 直接就是通信循环
# g$ _1 f: c( J( _4 l' w" v) p7 qwhile True:
- h2 U5 Z/ R U% u! S data, addr = server.recvfrom(1024)1 k' @, a+ V2 P5 z5 b$ G; G" V
print('数据:',data) # 客户端发来的消息
/ O. }# v' c* u- J5 p, {8 g print('地址:',addr) # 客户端的地址
* y# s2 o( d5 q/ z$ y server.sendto(data.upper(),addr)7 l/ h9 t9 t* X) j, V2 Y7 _5 v
socketserver模块$ x9 n5 l7 H" U! P7 @
import socketserver( i) {- `+ m2 V- T
class MyServer(socketserver.BaseRequestHandler):7 T( ?/ G0 r. w5 d8 V/ j. [0 b
def handle(self):
$ U/ t3 n- M3 c # print('来啦 老弟')" [! u! N2 C1 V8 J# F* N
while True:
1 U/ a. s8 E, q- A data = self.request.recv(1024)8 `1 K8 ]/ B n t
print(self.client_address) # 客户端地址
" `7 p7 f) _/ v6 } print(data.decode('utf-8'))
& k' M6 v* O, I K- o self.request.send(data.upper())
, R# x, {/ A+ n. T9 d6 fif __name__ == '__main__':
) B; Z% m) l3 m0 X, ]# M' v4 B """只要有客户端连接 会自动交给自定义类中的handle方法去处理"""2 Z, l! S( K7 @$ ?. `
server = socketserver.ThreadingTCPServer(('192.168.13.8',8080),MyServer) # 创建一个基于TCP的对象" b6 S% N5 a( Y9 Q9 D& [7 P) V# g
server.serve_forever() # 启动该服务对象
" d8 q: L( |# k. e) v" p- g k+ j4 `; a+ g$ G" [. p0 }
6 t0 v5 s! j& d, d: D- r: H& m ' }3 X4 y6 x- K! ]. f
import socket( O* `% f" _- W# r# I. F
import time; O u. ?1 m7 H+ L7 L9 s% i; [
client = socket.socket(type=socket.SOCK_DGRAM)
% V# v. a8 [+ D2 x9 @& Jserver_address = ('192.168.13.8',8080)
5 m8 [1 r' M, r9 xwhile True:
: Y) |( m& S3 @3 f' p( D) A' D client.sendto(b'hello',server_address)$ G& Z" W# b* }9 r% U8 i6 n( ?" @
data,addr = client.recvfrom(1024)
) t. Q: L) ~* p ?5 ? print(data.decode('utf-8'),addr)
3 |# I9 \) j2 ~* p6 w time.sleep(1)5 n) y+ c) j- F A. g2 K- a
" y0 |& R9 F5 n' ^- _1 K3 W7 o1 }$ z( g4 |2 I: b, p2 A
|