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

udp 的基本使用例子python

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-8-25 09:00:04 | 显示全部楼层 |阅读模式
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 03:20 , Processed in 0.018506 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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