python中socket与UDP使用与通信详解
网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)。这样利用ip地址+协议+端口就可以标识网络的进程了。
- 所谓
进程
指的是:运行的程序以及运行时用到的资源这个整体称之为进程(进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间) - 所谓
进程间通信
指的是:运行的程序之间的数据共享
1.什么是socket
socket(简称 套接字
) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
2.python中创建socket
在 Python 中 使用socket 模块的函数 socket 就可以完成:
import socket
socket.socket(AddressFamily, Type)
说明:函数 socket.socket 创建一个 socket,该函数带有两个参数:
- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)(当然还有很多其他参数如SOCK_RAW 但都不常用)
0.关与socket套接字的使用其实很简单,跟文件的操作基本一致,3步:1.创建套接字2.使用套接字收/发数据3.关闭套接字
1.创建一个tcp socket(tcp套接字)
import socket
# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
.....代码区.............
# 不用的时候,关闭套接字
s.close()2.创建一个udp socket(udp套接字)import socket
# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
3.使用socket实现网络通信
3.1使用socket进行udp通信,发送数据给服务器
from socket import *# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)# 2. 准备接收方的地址
# '192.168.1.1'表示目的ip地址,这里是我本机的局域ip地址
# 8080表示目的端口,可以自己定义,等下一致即可
dest_addr = ('192.168.1.1', 8080) # 注意 是元组,ip是字符串,端口是数字# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")# 4. 发送数据到指定的电脑上的指定程序中,使用的是sendto()方法
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 5. 关闭套接字
udp_socket.close()
1.在windows中运行“网络调试助手”(百度即可)。在里面配置如下端口号和通信协议,打开进程执行通信
2.执行上面程序给192.168.1.1:8080使用udp协议的进程发送了通信内容:Hello,UDP
可以发现在程序中发送的udp通信数据,在网络调试助手中接收到了数据哈,如果多试几次执行程序,发送不同的数据给192.168.1.1:8080,发现虽然接受了到了数据,但是如下可以看出每次程序使用的端口都不一样 ,具体原因后面分析?
2.使用socket进行通信,实现接受和发送数据给“服务器”
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)# 2. 准备接收方的地址
dest_addr = ('192.168.1.1', 8080)# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])# 7. 关闭套接字
udp_socket.close()
在程序端发送数据,然后等待接受“网络调式助手”发回的信息
4.关于端口问题
1.客户端端口号一般是随机分配的。
- 每重新运行一次网络程序,上图圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
- 记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可
一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定。但是如果需要做成一个服务器端的程序的话,是需要绑定的,因为访问服务器的固定进程必须是唯一的。
2.绑定端口号
from socket import *
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 9527) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))# 5. 关闭套接字
udp_socket.close()
使用udp测试结果如下,给服务器端指定唯一端口,客户端与之通信
- 一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化
- 一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的
统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。
python中socket与UDP使用与通信详解相关推荐
- Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略
Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...
- python中的class怎么用_对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...
- python中class变量_对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...
- python中if语句的实例_对python中if语句的真假判断实例详解
说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发 ...
- Python中的list/tuple/dict/set数据类型详解
Python中的list/tuple/dict/set数据类型详解 Python内部内置了一些数据类型与结构,可以方便在编程时候的使用. list List存储一系列的有序集合,并且元素内容可变(可更 ...
- python中append函数解析_对python中的pop函数和append函数详解
对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...
- 站长在线Python精讲:在Python中匹配字符串的3个方法详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...
- 站长在线Python精讲:在Python中格式化字符串的两种方法详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...
- Python中Print()函数的用法___实例详解(二)(全,例多)
Python中Print()函数的用法___实例详解(二)(全,例多) 目录 十一.Print()小例子 十二.Print()中文输入显示乱码问题 十三.Print()写入文件 十四.print()在 ...
最新文章
- 运行时异常与一般异常有何异同?(转)
- Feedback about (Blockchain OR ML) AND (logistics)
- 【剑指offer】面试题34:二叉树中和为某一值的路径(Java)
- Linux系统编程:循环创建N个子线程并顺序输出
- OpenGL ES (三)着色器和程序
- oracle 分组 top10 sql,oracle sql 合龙 分组 聚合函数
- 97.用好浏览器的缓存
- Ubuntu下lamp(PHP+Mysql+Apache)搭建+完全卸载卸载方法
- Tf-idf推导及理解
- 个性化头像生成——微信小程序开发
- 烟雨黑帽seo超级模板站群-可一键清除内页URL转换成单页-百度搜狗超级模板站群-多城市网站站群
- java 北京 就业_叩丁狼教育北京Java一期就业报道
- 开发一个套crm系统软件需要多少钱
- 食肉动物和食草动物的双眼分布不同的原因
- 深入探索REST(1):如何设计好的RESTful API?
- 「ZBrush」学习ZB出来可以从事什么工作
- Eureka 没凉,别过度悲伤
- 什么是css3,css3选择器是什么
- java的mysql语句规范_mysql 规范
- linux centos7增加文件夹权限,在Centos7系统中实现用户和文件权限的管理