仅用学习参考
1. udp网络程序-发送数据
创建一个基于udp的网络程序流程很简单,具体步骤如下:
- 创建客户端套接字
- 发送/接收数据
- 关闭套接字
![13423234-37f45d2a0f2c23b2.jpg](https://i-blog.csdnimg.cn/blog_migrate/d828af9eae54cb27dd3cecfd6826c6ce.jpeg)
实验拓扑
![13423234-01d718ae268c448a.png](https://i-blog.csdnimg.cn/blog_migrate/f4fff5f1575f1303bfd4a6db9480b1ac.png)
- 在windows端,采用
NetAssist
网络调试工具接受数据,如下:
![13423234-2e5efed40311bb71.png](https://i-blog.csdnimg.cn/blog_migrate/af5aeff65de8e63d936749962ee41227.png)
- 在Centos7系统,编写python代码发送UDP数据请求。
代码如下:
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.2', 8080) # 注意 是元组,ip是字符串,端口是数字
# 3. 从键盘获取数据
#send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(b"hahahah", dest_addr)
#udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 关闭套接字
udp_socket.close()
运行现象:
在Centos7中运行脚本:
![13423234-b692a333886ab646.png](https://i-blog.csdnimg.cn/blog_migrate/e00777a4f7204a0ad85e19c6521f78be.png)
优化一下,使用input方法来发送数据,代码如下:
[root@server01 work]# vim client.py
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.2', 8080) # 注意 是元组,ip是字符串,端口是数字
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
#udp_socket.sendto(b"hahahah", dest_addr)
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 关闭套接字
udp_socket.close()
执行如下:
[root@server01 work]# python client.py
请输入要发送的数据:"hello server"
[root@server01 work]#
![13423234-44cc93c702d656ac.png](https://i-blog.csdnimg.cn/blog_migrate/5a54366f9c17a60a77d22faf3a17a49d.png)
2. udp网络程序-发送、接收数据
客户端发送数据的代码如下:
[root@server01 work]# vim client.py
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.116.128', 7788) # 注意 是元组,ip是字符串,端口是数字
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
#udp_socket.sendto(b"hahahah", dest_addr)
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 关闭套接字
udp_socket.close()
服务端接收数据的代码如下:
[root@server01 work]# vim server.py
#coding=utf-8
from socket import *
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) # 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()
测试执行如下:
![13423234-f0227372e05f6ff8.png](https://i-blog.csdnimg.cn/blog_migrate/561dcb602708048f983bd70bb5f18ee8.png)
从上面看,udp的之前数据已经成功传输。那么怎么循环传递数据呢?
![13423234-d54aa1b4043d1903.png](https://i-blog.csdnimg.cn/blog_migrate/4a82ab9627230e8469a209cd3e5e6171.png)
多次发送,才能多次接收
3. udp网络程序-多次发送、接收数据
客户端设置循环发送数据,当输入stop的时候,停止发送。
代码如下:
[root@server01 work]# vim client.py
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.116.128'表示目的ip地址
# 7788表示目的端口
dest_addr = ('192.168.116.128', 7788) # 注意 是元组,ip是字符串,端口是数字
while True:
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 发送stop,停止服务
if send_data == "stop":
break
# 5. 关闭套接字
udp_socket.close()
服务端设置循环接收数据,代码如下:
[root@server01 work]# vim server.py
#coding=utf-8
from socket import *
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)
while True:
# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 4. 显示接收到的数据
recv_result = recv_data[0].decode('gbk')
print(recv_result)
# 显示对方的ip和端口
print(recv_data[1])
if recv_result == "stop":
break
# 5. 关闭套接字
udp_socket.close()
执行如下:
![13423234-46c5ad50dd3c8eec.png](https://i-blog.csdnimg.cn/blog_migrate/14a215db325141466a3d7531e92a6b04.png)
从右边可以看到,客户端发送过来的端口每次都是变化的。那么能否固定一个端口号呢?
4. udp网络程序-固定客户端发送的端口号
客户端设置绑定发送数据的端口号,代码如下:
[root@server01 work]# vim client.py
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定客户端发送数据的端口号
local_addr = ('', 8008) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)
# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.116.128', 7788) # 注意 是元组,ip是字符串,端口是数字
while True:
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 发送stop,停止服务
if send_data == "stop":
break
# 5. 关闭套接字
udp_socket.close()
执行如下:
![13423234-2f7dc5d0b3c05077.png](https://i-blog.csdnimg.cn/blog_migrate/067f64a6be916ec5738b94c24f50b62f.png)
![13423234-7907ae6344e86e8a.png](https://i-blog.csdnimg.cn/blog_migrate/e63c97e4abe97c34200208e80247213e.png)
关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。