Socket通讯之UDP
Socket通讯
- UDP类型客户端
- UDP类型服务端
- 功能集合
UDP类型客户端
我们知道UDP是一个无连接的传输协议,所以在我们进行编写UDP类型的客户端时我们不用关系其他的一些事情,只管将数据发送出去就行了。
我们想要编写一个客户端,首先我们肯定需要导入Socket包,然后我们创建一个套接字。
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
在这里我们创建socket套接字时,我们传入了两个参数每一个是“socket.AF_INET”,还有一个是“socket.SOCK_DGRAM”。
其中“socket.AF_INET”表示我们使用的协议是IPV4,而“socket.SOCK_DGRAM”表示我们使用的是UDP类型的通讯技术。
当我们创建完套接字后,我们就可以准备发送数据了,在UDP中我们使用的是sendto()进行发送的。
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置IP及其端口信息(注意是元祖)
ip_port = (("127.0.0.1"), 1234)
data = "hello"
socket_UDP.sendto(data, ip_port)
运行结果:
我们发现直接报错了,说是要一个字节对象,而不是一个字符串。这里我们就需要对它进行一个编码即可。
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置IP及其端口信息(注意是元祖)
ip_port = (("127.0.0.1"), 1234)
data = "hello".encode("utf-8")
socket_UDP.sendto(data, ip_port)
运行结果:
可以很清晰的发现我们收到了来自客户端发送的消息。
这样一个基本的框架就成型了,现在我们想要循环且可控发送数据,代码如下:
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置IP及其端口信息(注意是元祖)
ip_port = (("127.0.0.1"), 1234)
while True:data = input("请输入与你要发送的消息:")if data == "exit":breaksocket_UDP.sendto(data.encode("utf-8"), ip_port)
socket_UDP.close()
运行结果:
UDP类型服务端
这里我们知道创建UDP服务端我们我们知道下面这几个步骤。
- 创建套接字
- 绑定IP及其端口信息
- 接收来自客户端的信息
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP及端口信息
ip_port = (("127.0.0.1"), 123)
socket_UDP.bind(ip_port)
# 接收信息
socket_recv = socket_UDP.recvfrom(1024)
print(socket_recv)
我们首先运行它:
我们通过客户端发送了一个消息后,发现它显示的是一个元祖,所以我们可以将这个接收到的数据抛开列出来。
通过代码一步步的提取,我也成功的把IP,端口,数据这三个数据提取出来了。
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP及端口信息
ip_port = (("127.0.0.1"), 123)
socket_UDP.bind(ip_port)
# 接收信息
socket_recv = socket_UDP.recvfrom(1024)
socket_data = socket_recv[0].decode("utf-8")
socket_ip_port = socket_recv[1]
socket_ip = socket_ip_port[0]
socket_port = socket_ip_port[1]
print(socket_data)
print(socket_ip_port)
print(socket_ip)
print(socket_port)
运行:
接下来我们只需要优化一下代码,就可以很清晰的显示出来自客户端的消息了。
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP及端口信息
ip_port = (("127.0.0.1"), 123)
socket_UDP.bind(ip_port)
# 接收信息
socket_recv = socket_UDP.recvfrom(1024)
# 提取客户端数据
socket_data = socket_recv[0].decode("utf-8")
# 提取IP及端口信息
socket_ip_port = socket_recv[1]
# 提取IP信息
socket_ip = socket_ip_port[0]
# 提取端口信息
socket_port = socket_ip_port[1]
print("[*] 来自 %s:%s 的信息为:%s" % (socket_ip, socket_port, socket_data))
运行:
很清楚的接收到客户端的信息,你好。
我们也可以写一个循环接收,只用在上面的代码中添加一个while循环即可。
import socket# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP及端口信息
ip_port = (("127.0.0.1"), 123)
socket_UDP.bind(ip_port)
while True:# 接收信息socket_recv = socket_UDP.recvfrom(1024)# 提取客户端数据socket_data = socket_recv[0].decode("utf-8")# 提取IP及端口信息socket_ip_port = socket_recv[1]# 提取IP信息socket_ip = socket_ip_port[0]# 提取端口信息socket_port = socket_ip_port[1]print("[*] 来自 %s:%s 的信息为:%s" % (socket_ip, socket_port, socket_data))
运行:
功能集合
我们也可以将这些功能全部集合在一起,客户端和服务端都能收都能发。
import socketdef main():print("请选择功能:\n""1. 发送数据\n""2. 接收数据\n""3. 退出程序")while True:choose = int(input("请输入你的选择:"))# 调用函数if choose == 1:UDP_Send()elif choose == 2:UDP_Recevice()elif choose == 3:exit()else:print("输入有误请重新输入!")def UDP_Recevice():# 创建套接字UDP_Socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 设置ip及其端口信息ip_port = (("127.0.0.1"), 12345)# 绑定ip及其端口UDP_Socket.bind(ip_port)while True:# 接收发送过来的信息UDP_data_ip_port = UDP_Socket.recvfrom(1024)# 优化发送过来的信息,让更具有可读性UDP_data = UDP_data_ip_port[0].decode("utf-8")if UDP_data == "exit":UDP_Socket.close()breakUDP_ip_port = UDP_data_ip_port[1]UDP_ip = UDP_ip_port[0]UDP_port = UDP_ip_port[1]print("来自%s:%s 的信息:%s" % (UDP_ip, UDP_port, UDP_data))def UDP_Send():# 创建套接字UDP_Socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 设置ip及其端口信息ip_port = (("127.0.0.1"), 1234)while True:# 定义数据包UDP_data = input("请输入你需要发送的消息:")UDP_Socket.sendto(UDP_data.encode("utf-8"), ip_port)if UDP_data == "exit":UDP_Socket.close()breakif __name__ == '__main__':main()
Socket通讯之UDP相关推荐
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- C#.net同步异步SOCKET通讯和多线程总结(转)
C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...
- 跨平台(windows+linux)的线程辅助程序,跨平台(Windows+Linux)的Socket通讯程序(二)—结构...
上一篇"跨平台(Windows+Linux)的Socket通讯程序"给出了Socket通讯底层的一些函数的包装方法/类,同时屏蔽了操作系统(Windows/Linux)的不同. 上 ...
- 关于Socket通讯时通讯协议的制定
在系统开发过程中,如果涉及到了Socket通讯,那就要制定好通讯的协议,只有制定好了规则,后面的工作才方便顺利展开,制作通讯协议时要考虑到通讯的安全性,必要的信息要经过加密处理,同时也要考虑到系统的可 ...
- 本地socket通讯 -转
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopb ...
- ABB机器人socket通讯
文章目录 前言 一.效果展示 二.知识储备 1.准备工作 2.套接字通信的示意图 3.客户端指令 4.服务器指令 三.源码说明 前言 Socket Messaging的作用是允许RAPID程序员通过T ...
- Java与C++Socket通讯注意
2019独角兽企业重金招聘Python工程师标准>>> c++与java进行socket通信时注意事项 因为java发送的都是网络字节序(big-endium),而c++是主机字节序 ...
- [置顶] 【C#】 Socket通讯客户端程序
这段时间一直在优化Socket通讯这块,经常和Socket打交道,现在分享给大家一个小的案例, 代码如下: byte[] m_dataBuffer = new byte [10]; I ...
- php udp发送和接收_php socket通信(tcp/udp)实例分析
本文实例讲述了php socket通信(tcp/udp)方法.分享给大家供大家参考,具体如下: 注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 2.server.p ...
最新文章
- TCP连接管理【三次握手-四次挥手】
- 图森无人车官宣D轮2.15亿美元融资,成卡车货运估值No.1
- [USACO15FEB]Superbull (最小生成树)
- 【ArcGIS微课1000例】0023:ArcGIS将地理照片(无人机照片)转为点(航迹)案例教程
- 微服务(一) --- 架构与选型
- 通过JS和CSS,实现网页加载中的动画效果
- 坐等价格!小米Civi今日下午发布:女性用户青睐之选
- 《软件工程导论》课后习题答案
- 在Altium Designer中利用阵列粘贴功能快速绘制元器件封装
- MatCaffe问题: make matcaffe 'matlab/+caffe/private/caffe_.mexa64' failed
- lua实现xxTea加解密
- Juniper SRX240 U盘升级junos
- c语言求阶乘的两种算法(递归和循环)
- Discuz!开发之模板制作CSS扩展规范与语法规范
- 清华大学推荐:这32本书籍你看过几本?
- 微信小程序最简单的轮播图
- 华为HCNA之SNMP基础配置实验
- webpack (九) -热更新——浏览器不刷新,更新打包后的结果
- Go爬取美女壁纸图片
- 梦幻西游维护公告里面的可转服务器,7月19日定期维护公告 转服预定调整为30天...
热门文章
- (产品分析)KFC肯德基APP分析报告
- oracle数据库表格连接数据库,excel中连接表格数据库-excel怎样连接oracle数据库(白痴级提问)...
- MultiDesk 是一个选项卡(TAB标签)方式的远程桌面连接 (Terminal Services Client)。
- 计算机网络系统有哪些核心技术,区块链核心技术体系架构的网络层主要包括什么...
- Dual Thrust(期货)
- 电子数据取证基础知识5
- Anaconda3下YOLOV3火焰检测
- 流媒体服务器分发RTSP视频流并发压力测试
- 使用HTML制作简易求职表
- android打印机驱动4521,三星打印机驱动官方下载