Python 实战 udp网络程序-发送、接收数据

1. udp网络程序-发送数据

创建一个基于udp的网络程序流程很简单,具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

实验拓扑

  • 在windows端,采用NetAssist网络调试工具接受数据,如下:
  • 在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中运行脚本:

优化一下,使用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]# 

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()

测试执行如下:

从上面看,udp的之前数据已经成功传输。那么怎么循环传递数据呢?

多次发送,才能多次接收

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()

执行如下:

从右边可以看到,客户端发送过来的端口每次都是变化的。那么能否固定一个端口号呢?

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()

执行如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Spring Boot 使用 Graylog 收集日志

Graylog是一个生产级别的日志收集系统,集成Mongo和Elasticsearch进行日志收集。其中Mongo用于存储Graylog的元数据信息和配置信息,...

31110
来自专栏aCloudDeveloper

Linux网络命令必知必会之瑞士军刀 nc(netcat)

nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 ...

44810
来自专栏程序员

TCP/IP协议模型

OSI参考模型虽然是ISO给出的,但是ISO在推进OSI协议标准化的进程上是比较缓慢的。而TCP/IP协议的标准化进程是相当快速的,因此现阶段的实际标准是TCP...

21120
来自专栏科技分享

Linux网络 - 数据包的接收过程【转】

转自:https://segmentfault.com/a/1190000008836467

21120
来自专栏程序员

UDP套接字编程——Python语言描述

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

13520
来自专栏程序员

TCP套接字编程——Python语言描述

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

7920
来自专栏pangguoming

centos7防火墙iptables开放常用端口

43920
来自专栏开发与安全

linux网络编程之socket(十四):基于UDP协议的网络程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

27820
来自专栏逆向技术

网络编程第三讲UDP编写

  UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP

8030
来自专栏linux驱动个人学习

浅谈TCP IP协议栈(四)IP协议解析

通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议...

15440

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励