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. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  2. 转 简单聊聊IT软件项目的风险及应对

    https://www.jianshu.com/p/b347adca87a6 前言 上段时间在一家演讲俱乐部做即兴演讲主持人,聊的就是风险管理,与会的小伙伴分享了不同行业的风险问题,令人受益匪浅,今天 ...

  3. 如何使用Spring Security手动验证用户

    1.概述 在这篇快速文章中,我们将重点介绍如何以编程方式在Spring Security和Spring MVC中设置经过身份验证的用户. 2. Spring Security 简而言之,Spring ...

  4. PSS下载助手(PSX Download Helper)1.7.6.1发布

    新增自动查找本地替换文件,让替换大法也更简单的计划…… 使用方法很简单,首先进入设置勾选“自动查找替换文件”,然后点击“选择目录”,最后保存设置即可.将文件下载至你选择的目录中,然后再次在主机/掌机端 ...

  5. Oracle ERP Interface堵住--Request Running too long time,查找Request执行的Sql

    Request Running too long time 堵住了INV Manager 导致INV Interface Pending 很多笔资料 Review 发现Request 实际执行SQL ...

  6. C. Journey

    C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  7. mongodb关联查询 和spring data mongodb

    GITHUB:https://github.com/peterowang/Springdata-mongo 使用DBRefs DBRefs中有三个字段 - $ref - 此字段指定引用文档的集合 $i ...

  8. 浏览器兼容之条件注释,cssHack

    对于形形色色的浏览器,随之而来的就是一些兼容问题,大多应该都是IE下的兼容问题,因为任何浏览器下出现渲染不一致都极有可能是我们自己的结构或样式不符合W3C的某些要求,或者说违背了浏览器的某些规则而先造 ...

  9. Generator 和 函数异步应用 笔记

    Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...

  10. C#小记

    1.背景:用fileinput 上传文件 直接上传文件,但有时会发现,这个不上传文件也是可以携带其他参数的, 如果直接用: uploadFile = context.Request.Files[]; ...