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服务端我们我们知道下面这几个步骤。

  1. 创建套接字
  2. 绑定IP及其端口信息
  3. 接收来自客户端的信息
# 创建套接字
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相关推荐

  1. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. C#.net同步异步SOCKET通讯和多线程总结(转)

    C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...

  4. 跨平台(windows+linux)的线程辅助程序,跨平台(Windows+Linux)的Socket通讯程序(二)—结构...

    上一篇"跨平台(Windows+Linux)的Socket通讯程序"给出了Socket通讯底层的一些函数的包装方法/类,同时屏蔽了操作系统(Windows/Linux)的不同. 上 ...

  5. 关于Socket通讯时通讯协议的制定

    在系统开发过程中,如果涉及到了Socket通讯,那就要制定好通讯的协议,只有制定好了规则,后面的工作才方便顺利展开,制作通讯协议时要考虑到通讯的安全性,必要的信息要经过加密处理,同时也要考虑到系统的可 ...

  6. 本地socket通讯 -转

    socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopb ...

  7. ABB机器人socket通讯

    文章目录 前言 一.效果展示 二.知识储备 1.准备工作 2.套接字通信的示意图 3.客户端指令 4.服务器指令 三.源码说明 前言 Socket Messaging的作用是允许RAPID程序员通过T ...

  8. Java与C++Socket通讯注意

    2019独角兽企业重金招聘Python工程师标准>>> c++与java进行socket通信时注意事项 因为java发送的都是网络字节序(big-endium),而c++是主机字节序 ...

  9. [置顶] 【C#】 Socket通讯客户端程序

    这段时间一直在优化Socket通讯这块,经常和Socket打交道,现在分享给大家一个小的案例, 代码如下: byte[] m_dataBuffer = new byte [10];         I ...

  10. php udp发送和接收_php socket通信(tcp/udp)实例分析

    本文实例讲述了php socket通信(tcp/udp)方法.分享给大家供大家参考,具体如下: 注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 2.server.p ...

最新文章

  1. TCP连接管理【三次握手-四次挥手】
  2. 图森无人车官宣D轮2.15亿美元融资,成卡车货运估值No.1
  3. [USACO15FEB]Superbull (最小生成树)
  4. 【ArcGIS微课1000例】0023:ArcGIS将地理照片(无人机照片)转为点(航迹)案例教程
  5. 微服务(一) --- 架构与选型
  6. 通过JS和CSS,实现网页加载中的动画效果
  7. 坐等价格!小米Civi今日下午发布:女性用户青睐之选
  8. 《软件工程导论》课后习题答案
  9. 在Altium Designer中利用阵列粘贴功能快速绘制元器件封装
  10. MatCaffe问题: make matcaffe 'matlab/+caffe/private/caffe_.mexa64' failed
  11. lua实现xxTea加解密
  12. Juniper SRX240 U盘升级junos
  13. c语言求阶乘的两种算法(递归和循环)
  14. Discuz!开发之模板制作CSS扩展规范与语法规范
  15. 清华大学推荐:这32本书籍你看过几本?
  16. 微信小程序最简单的轮播图
  17. 华为HCNA之SNMP基础配置实验
  18. webpack (九) -热更新——浏览器不刷新,更新打包后的结果
  19. Go爬取美女壁纸图片
  20. 梦幻西游维护公告里面的可转服务器,7月19日定期维护公告 转服预定调整为30天...

热门文章

  1. (产品分析)KFC肯德基APP分析报告
  2. oracle数据库表格连接数据库,excel中连接表格数据库-excel怎样连接oracle数据库(白痴级提问)...
  3. MultiDesk 是一个选项卡(TAB标签)方式的远程桌面连接 (Terminal Services Client)。
  4. 计算机网络系统有哪些核心技术,区块链核心技术体系架构的网络层主要包括什么...
  5. Dual Thrust(期货)
  6. 电子数据取证基础知识5
  7. Anaconda3下YOLOV3火焰检测
  8. 流媒体服务器分发RTSP视频流并发压力测试
  9. 使用HTML制作简易求职表
  10. android打印机驱动4521,三星打印机驱动官方下载