找回密码
 注册
查看: 1971|回复: 0

udp 的基本使用例子python

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-8-25 09:00:04 | 显示全部楼层 |阅读模式
UDP通信

! _/ Z. S  X( f4 m0 [# l8 `1 ^
数据报协议(自带报头)
6 h8 I- p- x" O* M8 l* \  Y9 j
没有双向通道 通信类似于发讯息

4 k: e% q9 N  T1 Q

  t+ {* x% A& o+ ?. V, d+ a6 _" y

. b- O4 B4 n1 x1 ^9 |- T5 Q+ `& `: N# i
1.udp协议客户端允许发空
7 t) ?7 N$ j' Y2.udp协议不会粘包
. V- ?/ p9 G9 [* \3.udp协议服务端不存在的情况下,客户端照样不会报错?
0 h6 S% }1 k* A9 L* Y4.udp协议支持并发

- K  w3 I: ^; ]3 ^$ H( v
UDP类似于发短信
9 d' I% R# t0 K, W" |# ~5 b% I1 T; wTCP类似于打电话
) B: w: R; a' d6 @* y ' S# b7 L5 @! m6 x
并发:看起来像同时运行的
" P) b4 N& y: i! h( _并行:真正意义上的同时运行

( t7 O6 u+ S2 K; }- y7 v6 [* `# T7 \4 u8 g
/ i( i# y' v6 U9 z( m
udp 的基本使用- ]) z- B; T% k8 j
客户端; c: v0 M4 d& F7 P
import socket( f( T' j6 `8 p- ~% f  H1 h5 e
client = socket.socket(type=socket.SOCK_DGRAM), A3 ?! F: L5 M
# 不需要建立连接  直接进入通信循环) B* u* L* d0 F$ ^
server_address = ('192.168.13.8',8080)% E8 r8 u( s% {3 ]! J9 y2 c8 [
while True:0 g9 B- F; S* X5 ]
    client.sendto(b'hello',server_address)
' a) a% D3 P, ?4 Z4 T# T' C$ ?    data, addr = client.recvfrom(1024)# \5 Q$ H5 g0 K7 ]
    print('服务端发来的数据',data)
) q9 r" X$ A. V( h    print('服务端的地址',addr)9 m8 F; q" P! @0 _8 u

+ s9 ^- O$ i- `( O. V( L  i1 ^1 U服务端
) t  [' Q8 s* u2 [9 G9 himport socket0 P% _) ~: r+ ]( m4 ^
server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议3 s9 F# g' C2 h& H& |4 ^  P
server.bind(('192.168.13.8',8080))
& t. o, c( E! q% }& @/ V# UDP不需要设置半连接池 它也没有半连接池的概念5 w# J4 S* b( v0 p! |+ c4 m
# 因为没有双向通道  不需要accept  直接就是通信循环$ j4 P1 i) x1 n. q
while True:
: c. p2 b/ `9 ?1 q    data, addr = server.recvfrom(1024)( V7 Q: k8 `4 X* f& c  G7 e7 }  ~
    print('数据:',data)  # 客户端发来的消息7 S  E; r4 u: r9 n$ ~
    print('地址:',addr)  # 客户端的地址
+ q. z* r6 w4 J9 a6 N2 O    server.sendto(data.upper(),addr)
, G4 J0 h0 H. b8 @4 R2 a/ {socketserver模块
  s, T* W0 G( A1 j6 Zimport socketserver; J. T8 i' T8 s% z/ G3 T
class MyServer(socketserver.BaseRequestHandler):
  N' X& o6 N' m" H( e4 K: Y4 f    def handle(self):- N2 {7 f, Q8 m
        # print('来啦 老弟')( a8 h, c! `# `* N9 m
        while True:
& }) ]; r* y" C0 r            data = self.request.recv(1024): \3 x0 R! i8 V+ a, t  T
            print(self.client_address)  # 客户端地址' C* c9 k( e; m! s: {+ e4 R- N
            print(data.decode('utf-8'))# `: e1 m4 {) k
            self.request.send(data.upper())
8 M: ?+ T+ a$ a- }, s5 uif __name__ == '__main__':
2 G+ m2 B4 U7 H! M4 y) l    """只要有客户端连接  会自动交给自定义类中的handle方法去处理"""  ~: e) _; d% Q5 k5 z
    server = socketserver.ThreadingTCPServer(('192.168.13.8',8080),MyServer)  # 创建一个基于TCP的对象$ p# _. g7 S6 q  D' y! B' g
    server.serve_forever()  # 启动该服务对象; n: Q! n: V6 F6 ^8 }  t4 e
    9 A0 g& S' a5 c0 k$ y8 }  `
   
* R9 t7 t5 f2 j3 ^9 L6 `! c' [+ B   
" _9 `/ O4 G5 i9 H* p! Jimport socket
/ c9 q$ D* {3 Y7 S8 j1 uimport time
* O, y% [0 P" Q+ `# {3 u9 wclient = socket.socket(type=socket.SOCK_DGRAM)0 |3 V  Q$ e9 L  X
server_address = ('192.168.13.8',8080)
$ z, F) K  H3 b6 v  ~) J5 s8 Ewhile True:
- v4 C: l% J, ~4 T    client.sendto(b'hello',server_address)6 e* j( X. H; D
    data,addr = client.recvfrom(1024)
8 S+ A, O& C: w( P. {7 \    print(data.decode('utf-8'),addr)
0 b5 {! V# J1 l8 Y    time.sleep(1)
" j, s% D4 u# K' d) I& Y3 G. M3 b$ j
% G% C, Q+ q. P9 s9 O" V  _3 C8 u& P' O: g7 D1 y- R9 M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:09 , Processed in 0.017075 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表