Python UDP实例
UDP通信过程
udp 不需要经过3次握手和4次挥手,不需要提前建立连接,直接发数据就行。
server端
import socket
BUFSIZE = 1024
ip_port = ('127.0.0.1', 9999)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp协议
server.bind(ip_port)
while True:
data,client_addr = server.recvfrom(BUFSIZE)
print('server收到的数据', data) server.sendto(data.upper(),client_addr) server.close()
client端
import socket
BUFSIZE = 1024
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">> ").strip()
ip_port = ('127.0.0.1', 9999)
client.sendto(msg.encode('utf-8'),ip_port) data,server_addr = client.recvfrom(BUFSIZE)
print('客户端recvfrom ',data,server_addr) client.close()
输出结果
server: server收到的数据 b'hello'
server收到的数据 b'world' client:
>> hello
客户端recvfrom b'HELLO' ('127.0.0.1', 9999)
>> world
客户端recvfrom b'WORLD' ('127.0.0.1', 9999)
>>
粘包分析
第一种:
server
from socket import *
import time
server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8880)) res1=server.recvfrom(10) #b'hello'
print('第一次:',res1) res2=server.recvfrom(1024) #b'world'
print('第二次:',res2) server.close()
client
from socket import *
import time
client = socket(AF_INET, SOCK_DGRAM) client.sendto(b'hello',('127.0.0.1',8880)) client.sendto(b'world',('127.0.0.1',8880)) client.close()
服务端结果:没有产生粘包
第一次: (b'hello', ('127.0.0.1', 63959))
第二次: (b'world', ('127.0.0.1', 63959))
第二种:
server: from socket import *
import time
server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8880)) res1=server.recvfrom(2) #b'he'
print('第一次:',res1)
time.sleep(6)
res2=server.recvfrom(1024) #b'world'
print('第二次:',res2) server.close() client: from socket import *
import time
client = socket(AF_INET, SOCK_DGRAM) client.sendto(b'hello',('127.0.0.1',8880))
time.sleep(5)
client.sendto(b'world',('127.0.0.1',8880)) client.close()
输出结果
windows直接报错:
Traceback (most recent call last):
/路飞/第三模块/第二章网络编程/06 基于udp协议的套接字/服务端.py", line 24, in <module>
res1=server.recvfrom(2) #b'he'
OSError: [WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。 mac或linux:
直接丢包,只收到b'he',后面的llo不会收到
TCP VS UDP
tcp基于链接通信
- 基于链接,则需要listen(backlog),指定连接池的大小
- 基于链接,必须先运行的服务端,然后客户端发起链接请求
- 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
- 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
udp无链接
- 无链接,因而无需listen(backlog),更加没有什么连接池之说了
- 无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
- recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
- 只有sendinto发送数据没有recvfrom收数据,数据丢失
Python UDP实例的更多相关文章
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- python基础——实例属性和类属性
python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...
- python 发送邮件实例
留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例
- Python UDP broadcast PermissionError: [Errno 13] Permission denied
/********************************************************************** * Python UDP broadcast Permi ...
- Python Udp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...
- python Cmd实例之网络爬虫应用
python Cmd实例之网络爬虫应用 标签(空格分隔): python Cmd 爬虫 废话少说,直接上代码 # encoding=utf-8 import os import multiproces ...
- Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取
很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
随机推荐
- 2019.01.02 洛谷P4512 【模板】多项式除法
传送门 解析 代码: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long l ...
- javascript捕获页面窗口关闭事件
javascript捕获窗口关闭事件有两种方法 onbeforeunload() ,onUnload() 用法有两种: 1. function window.onbefore ...
- spring mvc 文件上传工具类
虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...
- MongoDB-增删改
MongoDB的shell使用了Js引擎,因此能运行任意的Js程序. MongoDB中常用基本数据类型: null:空值或者不存在的字段Boolean:true,false数值型:{"x&q ...
- ubuntu 出现device not managed,解决方法
1. 编辑/etc/NetworkManager/NetworkManager.conf: sudo vi /etc/NetworkManager/NetworkManager.conf将其中的man ...
- js点击空白处触发事件
我们经常会出现点击空白处关闭弹出框或触发事件 <div class="aa" style="width: 200px;height: 200px;backgroun ...
- 屏幕抓取程序 (位图DDB的例子)
屏幕抓取程序的意思是将整个屏幕图显示在应用程序的用户区中,等价于截图.对桌面窗口的操作:首先得知道桌面窗口的宽和高,获取宽和高需要利用窗口的设备句柄,而获取设备句柄需要知道窗口句柄,这一系列的连串关系 ...
- WebGIS博客文本分析(词频分析)手动扒取 去除格式 词语分割 统计分析
1. [置顶](一)开篇—杂谈WebGIS 摘要: 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 ...
- Alpha阶段敏捷冲刺(二)
1.提供当天站立式会议照片一张. 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:上网了解了艾宾浩斯遗忘曲线算法. 徐璐琳:找交互模块的源 ...
- Webpack 学习2
webpack + react 优化:缩小js包体积 webpack 介绍 & 安装 & 常用命令 30分钟手把手教你学webpack实战 Webpack 中文指南