Python学习之路-----udp发送数据

套接字

socket(套接字)是为了网络传输而设计的一种通信机制,通过实际所使用的传输层协议的不同分为udp和tcp套接字。

实例

网络应用程序分为客户端和服务端,二者的区别是服务端是用来处理客户端的请求的,因此一般来说服务端程序是要先运行起来。

服务端代码:

#coding=utf-8

from socket import *
import  time
udpsocket = socket(AF_INET,SOCK_DGRAM)
#创建一个udp类型套接字

bindAddr = ('',8888)
#以元组的形式表达IP和端口号,单引号中不写IP地址表示可以接收发往本机中任何一个IP地址的数据

udpsocket.bind(bindAddr)
#将要监听的IP和端口信息与套接字绑定起来,这样可以防止server端每次运行时由系统分配端口。在实际应用中,我们想要与某个程序通信就需要先知道它的端口

print('正在等待来自客户端的信息:')
recvData = udpsocket.recvfrom(1024)
#接收对方发过来的信息

#网络传输过程中使用的都是byte对象,因此需要转化成字符串才能看到原本传输的信息。
print('收到来自客户端的信息:',recvData)
print(recvData[0].decode())
time.sleep(3)
print('\n\n将要回复给:',recvData[1])
str = '\t\t\t香港是中国的一部分!!!'
udpsocket.sendto(str.encode(),recvData[1])
udpsocket.close()


结果:
正在等待来自客户端的信息:
收到来自客户端的信息: (b'\xe7\xa5\x96\xe5\x9b\xbd\xe4\xb8\x87\xe5\xb2\x81', ('127.0.0.1', 57668))
祖国万岁


将要回复给: ('127.0.0.1', 57668)

 

客户端代码:

#coding=utf-8

from socket import *

udpsocket = socket(AF_INET,SOCK_DGRAM)

sendAddr = ('127.0.0.1',8888)

sendData = input('请输入你要发送的消息:')

udpsocket.sendto(str.encode(sendData) ,sendAddr)

recvData = udpsocket.recvfrom(1024)
print(recvData)
print(recvData[0].decode())
print(recvData[1])
udpsocket.close()


结果:
请输入你要发送的消息:祖国万岁
(b'\t\t\t\xe9\xa6\x99\xe6\xb8\xaf\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe7\x9a\x84\xe4\xb8\x80\xe9\x83\xa8\xe5\x88\x86\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81', ('127.0.0.1', 8888))
			香港是中国的一部分!!!
('127.0.0.1', 8888)

Process finished with exit code 0

 

结合运行结果和代码注释可以很明白每行代码的意思,需要注意的就是:

  1. 指定一个明确的访问地址需要IP地址和端口两个值,需要包含在元组中作为函数的参数;
  2. sendto()方法和recvfrom()方法是配套使用的,服务端和客户端的套接字应是同一种传输协议类型。;
  3. python3中网络传输的数据都是byte对象,因此需要使用字符串的encode方法来转化成字节对象,收到字节对象后需要使用decode方法来转化成字符串对象;

byte和str

#coding=utf-8

str1 = 'hello world'
byte1 = b'hello world'

print(type(str1),type(byte1))
print()
print(str1.encode(),type(str1.encode()))
print(byte1.decode(),type(byte1.decode()))


结果:
<class 'str'> <class 'bytes'>

b'hello world' <class 'bytes'>
hello world <class 'str'>

UDP的特点

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

【适用情况】

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

  • 语音广播
  • 视频
  • TFTP(简单文件传送)
  • SNMP(简单网络管理协议)
  • RIP(路由信息协议,如报告股票市场,航空信息)
  • DNS(域名解释)

注重速度流畅

UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值