如何注册网站平台重庆网站建设重庆零臻科技行
web/
2025/10/8 11:09:16/
文章来源:
如何注册网站平台,重庆网站建设重庆零臻科技行,网站怎么建设可以发图评论,2网站免费建站简介 在网络通信编程中#xff0c;用的最多的就是UDP和TCP通信了#xff0c;原理这里就不分析了#xff0c;网上介绍也很多#xff0c;这里简单列举一下各自的优缺点和使用场景
通信方式优点缺点适用场景UDP及时性好#xff0c;快速视网络情况#xff0c;存在丢包 与嵌入…简介 在网络通信编程中用的最多的就是UDP和TCP通信了原理这里就不分析了网上介绍也很多这里简单列举一下各自的优缺点和使用场景
通信方式优点缺点适用场景UDP及时性好快速视网络情况存在丢包 与嵌入式设备通信实时控制 场景 TCP丢包会自动重发理论上不用担心丢包问题延时相对大一些 通信可靠性场景比如IoT设备 控制状态同步
一、socket 我们要进行网络通信那么就要用到socketsocket即网络套接字应用程序可以通过它发送或接收数据可对其进行像对文件一样的打开、读写和关闭等操作。 在 Python 中使用socket 模块的函数 socket 就可以创建一个socket对象socket()函数的参数分别有family, type, proto。
1.其中family参数是指协议域又称为协议族family常用的协议族有AF_INET、AF_INET6、...等等AF_INET指ipv4AF_INET6即为ipv6 2.然后是typetype指定socket类型有SOCK_STREAM流式套接字主要用于 TCP 协议和SOCK_DGRAM数据报套接字主要用于 UDP 协议等等 3.proto就是指定的协议常用的协议有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议但是type和proto不可以随意组合当proto参数为0或者不填时会自动选择type类型对应的默认协议。 二、UDP发送数据 首先我们要导入socket包
import socket
创建一个udp套接字ipv4协议使用SOCK_DGRAM参数不填proto就会默认自动选择udp协议
# 1、创建一个UDP套接字
udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
然后我们把要接收数据的那一端的ip地址和端口号放在一个元组里准备好
# 2. 准备接收方的地址和端口127.0.0.1:12341表示目的ip地址12341表示目的端口号
dest_addr (127.0.0.1, 12341) # 注意这是一个元组其中ip地址是字符串端口号是数字 准备好后就可以使用sendto函数进行发送了要注意需要对字符串进行编码才可以发送
# 3. 发送数据到指定的ip和端口
udp_socket.sendto(Hello,I am a UDP socket..encode(utf-8), dest_addr)
发送完就可以关闭套接字了
# 4. 关闭套接字
udp_socket.close() 例程一UDP server端UDP数据接收
#!/usr/bin/python3
# -*- coding: utf-8 -*-
udp通信例程udp server端修改udp_addr元组里面的ip地址即可实现与目标机器的通信
此处以单机通信示例ip为127.0.0.1实际多机通信此处应设置为目标客户端ip地址
from time import sleep
import socketdef main():# udp 通信地址IP端口号udp_addr (127.0.0.1, 9999)udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口udp_socket.bind(udp_addr)# 等待接收对方发送的数据while True:recv_data udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数# 打印接收到的数据print([From %s:%d]:%s % (recv_data[1][0], recv_data[1][1], recv_data[0].decode(utf-8)))if __name__ __main__:print(当前版本 , __version__)print(udp server )main()
代码解析 1.socket函数中第二个参数就是通信类型此处SOCK_DGRAM 就是指定使用UDP通信 2.服务端需要使用bind函数绑定端口客户端不需要因为客户端发送的时候已经带了端口参数 例程二UDP client端UDP数据发送
#!/usr/bin/python3
# -*- coding: utf-8 -*-
udp通信例程udp client端修改udp_addr元组里面的ip地址即可实现与目标机器的通信
此处以单机通信示例ip为127.0.0.1实际多机通信此处应设置为目标服务端ip地址
from time import sleep
import socketdef main():# udp 通信地址IP端口号udp_addr (127.0.0.1, 9999)udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 发送数据到指定的ip和端口,每隔1s发送一次发送10次for i in range(10):udp_socket.sendto((Hello,I am a UDP socket for: str(i)) .encode(utf-8), udp_addr)print(send %d message % i)sleep(1)# 5. 关闭套接字udp_socket.close()if __name__ __main__:print(当前版本 , __version__)print(udp client )main() 例程三多线程实现UDP数据收发
#!/usr/bin/python3
# -*- coding: utf-8 -*-
python多线程通信
from time import sleep
import socket
import threading# 定义全局变量
t1_count 0
t2_count 0def udp_received_hundle(s):global t1_countprint(this is thread 1 running)while True:t1_count 1print(thread 1 第 %s 次运行 % t1_count)recv_data s.recvfrom(1024) # 1024表示本次接收的最大字节数# 打印接收到的数据print([From %s:%d]:%s % (recv_data[1][0], recv_data[1][1], recv_data[0].decode(utf-8)))def udp_send_hundle(s):global t2_countprint(this is thread 2 running)while True:t2_count 1print()print(thread 2 第 %s 次运行 % t2_count)s.sendto((Hello,I am a UDP socket for: str(t2_count)).encode(utf-8), udp_addr)print(send %d message % t2_count)print()sleep(1)if __name__ __main__:print(当前版本 , __version__)# 初始化# udp 通信地址IP端口号udp_addr (127.0.0.1, 9999)udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口:udp_socket.bind(udp_addr)# 定义线程thread_list []t1 threading.Thread(targetudp_received_hundle, args(udp_socket, ))thread_list.append(t1)t2 threading.Thread(targetudp_send_hundle, args(udp_socket, ))thread_list.append(t2)for t in thread_list:t.setDaemon(True)t.start()for t in thread_list:t.join()print(exit all task.)print(all process end.)
代码解析 这里用到了多线程虽然python中的多线程是假的多线程实际上是一个线程分时复用这里我们不深究如果平常用到也就几个小任务跑一跑抄我这个作业就ok。 多线程实际上是从t.join()后才开始正式运行的这里一定要注意不能漏了这个函数。 udp的收发与上面的例程几乎是一样的。 代码运行效果如下
当前版本 1.0.0
this is thread 1 running
thread 1 第 1 次运行
this is thread 2 runningthread 2 第 1 次运行
send 1 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 1
thread 1 第 2 次运行thread 2 第 2 次运行
send 2 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 2
thread 1 第 3 次运行thread 2 第 3 次运行
send 3 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 3
thread 1 第 4 次运行thread 2 第 4 次运行
send 4 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 4
thread 1 第 5 次运行thread 2 第 5 次运行
send 5 message 使用网络调试助手测试程序注意如果不是在本机windows系统上运行python程序在Ubuntu虚拟机或者其他局域网内的机器上运行要把windows的防火墙关了 然后我们让其每隔一秒发送一次发送10次发送成功 完整代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Williamimport socket,timedef main():# 1、创建一个UDP套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 准备接收方的地址和端口192.168.0.107表示目的ip地址8080表示目的端口号dest_addr (192.168.8.226, 12341) # 注意这是一个元组其中ip地址是字符串端口号是数字# 3. 发送数据到指定的ip和端口for i in range(10):udp_socket.sendto(Hello,I am a UDP socket..encode(utf-8), dest_addr)time.sleep(1)# 4. 关闭套接字udp_socket.close()if __name__ __main__:main()
三、UDP接收数据 在之前发送数据的时候我们可以看到其端口号是一直在变得那么我们要接收数据就需要知道其端口号是什么所以我们要先固定一个端口号使用bind函数
# 2. 绑定本地的相关信息如果不绑定则系统会随机分配一个端口号
local_addr (, 12344) # ip地址和端口号ip一般不用写表示本机的任何一个ip
udp_socket.bind(local_addr)
接收数据使用recvfrom函数其参数为接收的最大数据长度
# 3. 等待接收对方发送的数据
recv_data udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
接收完后将其打印出来
# 4、打印接收到的数据
print(recv_data)
运行通过网络调试助手发送数据 可以看到打印出来的信息是一个元组第一项接收到的字符串第二项也是一个元组包含对方的IP地址和端口号 完整代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Williamimport socket,timedef main():# 1、创建一个UDP套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 绑定本地的相关信息如果不绑定则系统会随机分配一个端口号local_addr (, 12344) # ip地址和端口号ip一般不用写表示本机的任何一个ipudp_socket.bind(local_addr)# 3. 等待接收对方发送的数据recv_data udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数# 4、打印接收到的数据print(recv_data)# 5. 关闭套接字udp_socket.close()if __name__ __main__:main() 四、UDP收发数据 实现这样一个功能通过UDP发送10次消息然后等待接收将接收的数据及其来源打印出来 完成代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Williamimport socket,timedef main():# 1、创建一个UDP套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 绑定本地的相关信息如果不绑定则系统会随机分配一个端口号udp_socket.bind((, 12344))# 3. 发送数据到指定的ip和端口,每隔1s发送一次发送10次for i in range(10):udp_socket.sendto(Hello,I am a UDP socket..encode(utf-8), (192.168.8.226, 12341))time.sleep(1)# 4. 等待接收对方发送的数据while(True):recv_data udp_socket.recvfrom(1024)# 打印接收到的数据print([From %s:%d]:%s%(recv_data[1][0],recv_data[1][1],recv_data[0].decode(utf-8)))# 5. 关闭套接字udp_socket.close()if __name__ __main__:main() 五、同时收发数据 现在实现这样一个功能即运行程序然后在控制台输入字符串发送出去同时还可以接收数据我使用多线程来实现这个程序不过要实现方便接收我们在程序的开始将IP地址和端口号打印出来实现效果如下 实现代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Williamimport socket,time,threadingdef recv_thread(socket):# 等待接收对方发送的数据while(True):try:recv_data socket.recvfrom(1024)# 打印接收到的数据print([From %s:%d]:%s%(recv_data[1][0],recv_data[1][1],recv_data[0].decode(utf-8)))except Exception:breakdef main():# 1、创建一个UDP套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2、绑定本地的相关信息如果不绑定则系统会随机分配一个端口号udp_socket.bind((, 12344))# 3、打印本机ip地址和端口号print(local ipaddr and port-,socket.gethostbyname(socket.gethostname()):12344)# 4、创建一个线程用来接收数据t threading.Thread(targetrecv_thread, args(udp_socket,))t.start()# 5、等待输入数据,然后发送出去直到输入的数据为quitwhile(True):print(please input a string.input quit to quit.)send_data input()if send_data quit:breakelse:udp_socket.sendto(send_data.encode(utf-8), (192.168.8.226,12341))# 6、关闭套接字udp_socket.close()def main1():# 1、创建一个UDP套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 准备接收方的地址和端口192.168.0.107表示目的ip地址8080表示目的端口号dest_addr (192.168.8.226, 12341) # 注意这是一个元组其中ip地址是字符串端口号是数字# 3. 发送数据到指定的ip和端口for i in range(1):udp_socket.sendto(Hello,I am a UDP socket..encode(utf-8), dest_addr)time.sleep(1)# 4. 等待接收对方发送的数据recv_data udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数# 5、打印接收到的数据print(recv_data)# 4. 关闭套接字udp_socket.close()if __name__ __main__:main()
结语 这里只是UDP的简单使用给大家一个示例参考在实际应用过程中涉及到复杂数据通信还需要使用通信协议协议收发解包等函数另外数据缓存也很关键尤其是大数据量的情况下通常会用到队列相关知识这一部分就留给大家自行研究吧如果这篇文章对你有用不妨点赞关注你的支持是我最大的动力。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89017.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!