UDP协议:

  1、python中基于udp协议的客户端与服务端通信简单过程实现

  2、udp协议的一些特点(与tcp协议的比较)

       3、利用socketserver模块实现udp传输协议的并发通信

-------------------------------------------------------------------------------------------------------------------------------------

一、UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议

  • 与TCP协议不同的是,UDP协议在传输时候无需双方建立双向连接,只需要知道对方的IP和PORT(端口)就可以

  而且UDP协议传输具有不安全行,或者说是即时性,给对方发送信息时候,只管发,至于他收不收得到都不会去考虑,

  不管是服务端还是客户端都一样。

  • UDP叫数据报协议,意味着发消息都带有数据报头,UDP的server不需要进行监听也无需建立连接,在启动服务之后只能被动的等待客户端发消息过来,客户端发消息的时候,要带上服务端的地址,服务端在回消息的时候,也要带上客户端的地址

  下面来简单实现基于UDP协议的客户端、服务端通信

#  服务端:

import socket
# udp传输的服务端无需半连接池,因为通信无需建立双向连接通道,无需三次握手四次挥手,只要知道对方ip和port就行
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080)) # 通信循环
while True:
data, client_addr = server.recvfrom(1024) # 这里接收用recvfrom
print('收到客户端发来的udp消息%s' % data.decode('utf-8'))
server.sendto(data.upper(), client_addr) # 这里发送用sendto # 客户端: import socket
# 无需connect服务端,因为发送时候跟上服务端ip和port就行
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True:
msg = 'hello'
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
data, server_addr = client.recvfrom(1024)
print(data.decode('utf-8'))

二、UDP协议的一些特点

总结几个UDP协议的特点:

  • 客户端允许发空
  • 不会粘包
  • 服务端不存在的时候,客户端照发无误,不会报错(*-*)
  • 可以实现简单的并发效果
    # 验证UDP是否有粘包问题:
    from socket import *
    server = socket(AF_INET, SOCK_DGRAM)
    server.bind(('127.0.0.1', 8080)) while True:
    data1, addr = server.recvfrom(1024)
    data2, addr = server.recvfrom(1024)
    data3, addr = server.recvfrom(1024)
    data4, addr = server.recvfrom(1024)
    data5, addr = server.recvfrom(1024) print(data1)
    print(data2)
    print(data3)
    print(data4)
    print(data5) from socket import *
    client = socket(AF_INET, SOCK_DGRAM) while True:
    client.sendto(b'Hello1', ('127.0.0.1', 8080))
    client.sendto(b'Hello2', ('127.0.0.1', 8080))
    client.sendto(b'Hello3', ('127.0.0.1', 8080))
    client.sendto(b'Hello4', ('127.0.0.1', 8080))
    client.sendto(b'Hello5', ('127.0.0.1', 8080)) # 打印的每条数据都是独立的,没有2条数据在一起的情况
    UDP不存在粘包问题,是由于UDP发送的时候,没有经过Nagle算法的优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。

三、利用socketserver模块实现udp协议的并发通信

## 服务端:
import socketserver
from threading import currentThread # 这里导入当前线程方法,得到当前线程名称 class MyUdpHandler(socketserver.BaseRequestHandler):
def handle(self):
# 这里和tcp利用socketserver模块并发的服务端不一样,tcp服务端是直接data = self.request.recv(1024)
data, sock = self.request # 这里多了一个sock,这个sock用于发送,同时self对象本身可以得到client_address
msg = '%s [%s]' % (currentThread().name, data.upper().decode('utf-8'))
sock.sendto(msg.encode('utf-8'), self.client_address) if __name__ == '__main__':
server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyUdpHandler)
server.serve_forever() ## 客户端
from threading import Thread,currentThread
import time
from socket import *
def task():
client = socket(AF_INET,SOCK_DGRAM)
addr = ('127.0.0.1', 8080)
n = 0
while n < 10: # 模拟让每个客户端与服务端通信循环10次。
msg = '%s [%s]' % (currentThread().name, n)
client.sendto(msg.encode('utf-8'), addr)
data, addr0 = client.recvfrom(1024)
print(data.decode('utf-8'))
n += 1 if __name__ == '__main__':
for i in range(50): # 开启50个客户端线程去连接服务端,模拟并发
t = Thread(target=task)
t.start()

Python中的端口协议之基于UDP协议的通信传输的更多相关文章

  1. python 全栈开发,Day34(基于UDP协议的socket)

    昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...

  2. TwinCAT 3中基于UDP协议通讯的C++实现

    因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识.这个做个简单的笔记,方便以后查询. 1 概述 倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函 ...

  3. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  4. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  5. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  6. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  7. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  8. 基于UDP协议的控制台聊天

    这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...

  9. 基于UDP协议的网络编程

    UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...

随机推荐

  1. hdu5726-GCD-ST表+二分

    先用st表处理出所有l-r的GCD值,然后二分求得这些值一共出现了多少次. #include<bits/stdc++.h> #define inf 0x3f3f3f3f ; using n ...

  2. c# 类名不同,字段相同,如何快速给类赋值

    1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...

  3. AJPFX关于JDK,JRE,JVM的区别与联系

    很多朋友可能跟我一样,对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天我们来整理下三者的关系. JDK : Java Development ToolKit(Java开发工具包) ...

  4. 结合源码看nginx-1.4.0之nginx内存管理详解

    目录 0. 摘要 1. nginx内存结构设计 2. nginx内存数据结构 3. nginx内存管理原理 4. 一个简单的内存模型 5. 小结 6. 参考资料 0. 摘要 内存管理,是指软件运行时对 ...

  5. Wrinkles should merely indicate where smiles have been.

    Wrinkles should merely indicate where smiles have been. 皱纹应该只是微笑留下的印记.

  6. SpringBoot:异步开发之异步调用

    前言 除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候正常就是启一个新线程去做一些业务处理,让主线 ...

  7. iOS - KVO 简单应用

    KVO(键值监听)全称 Key Value Observing.使用KVO可以实现视图组件和数据模型的分离,视图作为监听器,当模型的属性值发生变化后,监听器可以做相应的处理.KVO的方法由NSKeyV ...

  8. RK3288开发过程中遇到的问题点和解决方法之Kernel

    修改背光改变区间 kernel\drivers\video\backlight\pwm_bl.c static int pwm_backlight_update_status(struct backl ...

  9. JavaScript命名——name不能做变量名

    使用name作为变量名(var name = ‘’),在IE中未引起bug,在Chrome中引起bug但未明确指出命名错误,而是会报其他错误,故不便于发现. 现象原因: javascript中name ...

  10. 如何检查SQL Server索引填充因子

    假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水.结果会怎样呢?水会溢出来. SQL Server 的情况也是如此.当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的 ...