python socket udp_python网络-Socket之udp编程(24)

一、udp简介

udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。

udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。

udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

udp是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

二、udp特点:

udp是面向无连接的通讯协议,udp数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 udp传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 udp是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。udp是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,udp一般用于多点通信和实时的数据业务,比如:

语音广播

TFTP(简单文件传送)

SNMP(简单网络管理协议)

RIP(路由信息协议,如报告股票市场,航空信息)

DNS(域名解释)

三、udp网络程序-发送数据

创建一个udp客户端程序的流程是简单,具体步骤如下:

创建客户端套接字

发送/接收数据

关闭套接字

代码如下:

#coding=utf-8

from socket import *

#1、创建socket套接字#socket(参数1,参数2)#参数1 = AF_INET固定的#参数2 = SOCK_DGRAM表示udp,上篇文章中说过SOCK_STREM表示tcp

udpSocket =socket(AF_INET,SOCK_DGRAM)#2、准备接收方的地址

sendAddress = ("192.168.100.101",8080)#3、从键盘输入需要发送的数据

sendData = input("请输入要发送的数据:")#4、发送数据到指定电脑

udpSocket.sendto(sendData.encode(),sendAddress)#5、关闭socket套接字

udpSocket.close()

运行程序:

这个时候我就向我的另外一台IP地址为:192.168.100.101 端口号为8080的程序发送了“我是侯哥”这一条消息。我们借助于网络调试助手软件用于测试,网络调试助手各个平台的系统都有,大家可以自己下载使用。

说明:我的代码是在windows电脑上运行的,我的网络调试助手是在Mac电脑上运行的,如果没有两台电脑的,也可以使用虚拟机测试。

四、udp网络程序-接收数据

#coding=utf-8

from socket import *

#1、创建socket套接字

udpSocket =socket(AF_INET,SOCK_DGRAM)#2、准备接收方的地址

sendAddress = ("192.168.100.101",8080)#3、从键盘输入需要发送的数据

sendData = input("请输入要发送的数据:")#4、发送数据到指定电脑

udpSocket.sendto(sendData.encode(),sendAddress)#5、等待接收对方发送的数据

receiveData = udpSocket.recvfrom(1024)#6、显示对方发送的数据

print(receiveData)#7、关闭socket套接字

udpSocket.close()

运行程序:

五、udp网络程序-端口问题

会变的端口号:重新运行多次脚本,然后在“网络调试助手”中,看到的现象如下:

说明:

每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配

记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可

六、udp绑定信息

一般情况下,在一天电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定,但是如果需要做成一个服务器端的程序的话,是需要绑定的。就像报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定

绑定示例

#coding=utf-8

from socket import *

#1、创建socket套接字

udpSocket =socket(AF_INET,SOCK_DGRAM)#2、绑定相关信息,如果一个网络程序不绑定,则系统会随机分配

bindAddress = ("",7781)#ip地址和端口号,ip一般不用写,表示本机的任何一个ip

udpSocket.bind(bindAddress)#3、等待接收方发送消息

receiveData = udpSocket.recvfrom(1024)#4、显示对方发送的数据

print(receiveData)#5、关闭socket套接字

udpSocket.close()

windows电脑发送信息

mac电脑接收信息如下:

说明:

一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行次程序端口可能会发生变化

一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的

七、udp网络通信过程

八、udp应用:多线程对话聊天实现

#coding=utf-8

from threading importThreadfrom socket import *

#接收数据

defreceiveInfo():whileTrue:

receiveData= udpSocket.recvfrom(1024)print("<

defsendInfo():whileTrue:

sendData= input("")

udpSocket.sendto(sendData.encode("gb2312"),(destIp,destPort))

udpSocket=None

destIp= ""destPort=0defmain():globaludpSocketglobaldestIpglobaldestPort

destIp= input("对方的IP:")

destPort= int(input("对方的Port:"))

udpSocket=socket(AF_INET,SOCK_DGRAM)

udpSocket.bind(("",4567))#这里写两个()的原因是将("",4567)当做一个整体元组使用

tr= Thread(target =receiveInfo)

ts= Thread(target =sendInfo)

tr.start()

ts.start()

tr.join()

ts.join()if __name__ == '__main__':

main()

Mac电脑上执行程序如下:

windows电脑上运行网络调试助手如下:

从而就是实现了基于socket的udp的聊天功能。

九、udp应用:多线程聊天室的实现

程序基本流程:创建接收端socket ---> 创建发送到socket ---> 启动接收端socket ---> 启动发送端socket ---> 等待用户输入 ---> 接收用户输入并发送到广播 ---> 接收信息并显示。

#-*- coding:utf-8 -*-

from socket import *

from time importctime, sleepimportthreadingclassChatRoomPlus:def __init__(self):#全局参数配置

self.encoding = "utf-8" #使用的编码方式

self.broadcastPort = 7788 #广播端口

#创建广播接收器

self.recvSocket =socket(AF_INET, SOCK_DGRAM)

self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR,1)

self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST,1)

self.recvSocket.bind(('', self.broadcastPort))#创建广播发送器

self.sendSocket =socket(AF_INET, SOCK_DGRAM)

self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST,1)#其他

self.threads =[]defsend(self):"""发送广播"""

print("UDP发送器启动成功...")

self.sendSocket.sendto("***加入了聊天室".encode(self.encoding), ('255.255.255.255', self.broadcastPort))whileTrue:

sendData= input("请输入需要发送的消息:")

self.sendSocket.sendto(sendData.encode(self.encoding), ('255.255.255.255', self.broadcastPort))#print("【%s】%s:%s" % (ctime(), "我", sendData))

sleep(1)defrecv(self):"""接收广播"""

print("UDP接收器启动成功...")whileTrue:#接收数据格式:(data, (ip, port))

recvData = self.recvSocket.recvfrom(1024)print("【%s】[%s : %s] : %s" % (ctime(), recvData[1][0], recvData[1][1], recvData[0].decode(self.encoding)))

sleep(1)defstart(self):"""启动线程"""t1= threading.Thread(target=self.recv)

t2= threading.Thread(target=self.send)

self.threads.append(t1)

self.threads.append(t2)for t inself.threads:

t.setDaemon(True)

t.start()whileTrue:pass

if __name__ == "__main__":

demo=ChatRoomPlus()

demo.start()

运行效果:

Mac电脑上运行

linux电脑上运行程序

windows上运行程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium--单选下拉列表

下拉选择 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("https://www.xxxxx.com/") sleep(2) driver.find_elements_by_tag_name(option)[2].click() # 通过标签名定位到 option 标签&#xff0c;选择第三个&#x…

matlab实现字符识别,字符识别 - MATLAB Simulink Example - MathWorks 中国

定义问题脚本 prprob 定义了一个包含 26 列的矩阵 X&#xff0c;每列对应一个字母。每列有 35 个值&#xff0c;值可能是 1&#xff0c;也可能是 0。每列(包含 35 个值)定义一个字母的 57 位图。矩阵 T 是一个 2626 的单位矩阵&#xff0c;它将 26 个输入向量映射到 26 个类。[…

python建立ip代理池_Python搭建代理IP池实现存储IP的方法

上一文写了如何从代理服务网站提取 IP&#xff0c;本文就讲解如何存储 IP&#xff0c;毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多&#xff0c;直接一点的可以放在一个文本文件中&#xff0c;但操作起来不太灵活&#xff0c;而我选择的是 MySQL 数据库&#xff…

低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼有四个文件&#xff1a;demo.mfunction [] demo()%This routine demonstrates an example of using LRR to do subspace segmentation. We cosntruct 5 independent subspaces, each of which has a rank of 10,%sample 200 point…

python深度神经网络算法_02.深度神经网络算法之Python基础与数据分析

资源内容&#xff1a;02.深度神经网络算法之Python基础与数据分析|____2016最新python基础篇视频教程22课|____Python学习手册(第4版).pdf|____Python程序入门与进阶|____基础篇01-福利课python先入为主上篇|____基础篇02-福利课python先入为主下篇|____基础篇03-虚拟机安装xub…

我们为什么要用MVC?ASP.NET MVC模式的优点?

1.关注点分离&#xff1a;每个功能最少会被切分为M-V-C三个部分&#xff0c;让开发者一次只需要关注一个部分&#xff0c;进而降低复杂难度&#xff0c;提高开发效率2.分层负责&#xff1a;明确切割&#xff0c;M-V-C三个部分并行开发3.自由操控HTML&#xff1a;在ASP.Net MVC中…

python 英语词频统计软件_Python实现统计英文文章词频的方法分析

本文实例讲述了Python实现统计英文文章词频的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;应用介绍&#xff1a;统计英文文章词频是很常见的需求&#xff0c;本文利用python实现。思路分析&#xff1a;1、把英文文章的每个单词放到列表里&#xff0c;并统计列表…

mysql磁盘无法挂载,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)

试图挂载磁盘(硬件raid)但失败了.#mount -t ext4 /dev/sda /datamount: wrong fs type,bad option,bad superblock on /dev/sda,missing codepage or helper program,or other errorIn some cases useful info is found in syslog - trydmesg | tail or so#dmesg | tail -1EXT4…

程序中的内存分配

栈由操作系统自动分配释放 &#xff0c;用于存放函数的参数值、局部变量等&#xff0c;其操作方式类似于数据结构中的栈 1. 函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。 2. 栈的内存地址生长方向与堆相反&#xff0c;由…

python传中文参数_解决Python传递中文参数的问题

今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用urlencode来处理中文&#xff0c;由于国内外网站编码不同&#xff0c;国内是GBK的&#xff0c;国外是UTF8的。>>> import sys>>&…

数据结构php语言,PHP语言做网页开发,会用到什么数据结构,算法?

回复讨论(解决方案)这个要根据项目而定的&#xff0c;PHP做开发&#xff0c;首先得会html javascript不是 会用到什么数据结构&#xff0c;算法而是你将 什么数据结构&#xff0c;算法 用到网页开发中去这个要根据项目而定的&#xff0c;PHP做开发&#xff0c;首先得会html jav…

pythonpptx 楷体_python-pptx 实践 4:添加形状、文本

1、添加流程箭头#加载库importosfrom pptx importPresentationfrom pptx.util importInches, Ptfrom pptx.enum.text importPP_ALIGNfrom pptx.enum.shapes importMSO_SHAPEfrom pptx.dml.color importRGBColor#设置路径work_path rE:\pyspace\tmp\pptxos.chdir(work_path)#实…

C# DevExpress XtraMessageBox自定义字体,字体大小,自定义按钮大小,自定义Icon

1.使用XtraMessageBoxForm&#xff0c;自定义Icon 2.重写XtraMessageBoxForm&#xff0c;自定义消息字体&#xff0c;标题字体 3.注册XtraMessageBoxForm的Showing事件&#xff0c;自定义按钮字体及按钮大小 具体代码如下&#xff0c;只写了简单两种方法&#xff0c;可自己扩展…

php维护页面,php – Symfony2中的“维护网站”页面

我跟着这个tutorial.这非常简单直接.这是我所需要的.您只需更改参数然后清除prod缓存,您仍然可以在dev或测试环境中访问该应用程序.在你的parameters.yml中添加&#xff1a;parameters:maintenance: false #turn it to true to enable maintenanceunderMaintenanceUntil: tomor…

批处理结束某个进程_进程调度

当计算机系统是多道程序设计系统时&#xff0c;常常会出现多个进程或线程竞争CPU的情况。如果有大于处理器数的进程(线程)处于就绪态时&#xff0c;就必须要选择下一个要执行的进程(线程)。在操作系统&#xff0c;用于选择接下来要执行的进程的程序称之为调度程序(Scheduler)&a…

[RN] 可播放视频的播放器版本

可播放视频的播放器版本 "react": "16.6.3", "react-native": "0.57.8", "react-native-orientation": "^3.1.0", "react-native-vector-icons": "^4.3.0", "react-native-video":…

有限元python编程流行吗_Python进行有限元分析

本博客主要是来讲述采用Python语言&#xff0c;利用直接刚度法&#xff0c;来编写求解《有限元方法基础教程》(第五版) 的例题2.1。(也许有的人认为商业软件已经和普及了&#xff0c;没有 必要再自己进行编程了&#xff0c;但是龙猪在这里建议大家还是去了解一下有限元的原理&a…

java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树

题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例&#xff1a;例如&#xff0c;给出中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3]返回如下的二叉树&#xff1a;3/ \9 20/ \15 7思路1.思路与105. 从前序与中序…

Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏

一、 获取当前页面的全部信息 1. 图片信息包括图片名称、图片大小等信息 2. 只需将图片信息打印出来&#xff08;image.text image.size image.tag_name&#xff09; 二、 获取页面元素的href属性&#xff08;id同理&#xff09; 1. 获取当前页面所有的链接信息&#xff0…

动态游标for循环_数据结构系列循环链表

前面留的一个问题,后文更跟新回答单链表可以表示任意的线性关系&#xff0c;有些线性关系是循环的&#xff0c;既没有队尾元素。将单链表中的终端结点指针端由空指针改为指向头结点&#xff0c;这时的单链表形成国恒一个环&#xff0c;改为循环链表。插入与删除与单链表的原理甚…