socket-udp
1.socket介绍
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。
2.创建socket
在 Python 中 使用socket 模块的函数 socket 就可以完成:
import socket
udp_socket = socket.socket(AddressFamily, Type)
函数 socket.socket 创建一个 socket,该函数带有两个参数:
Address Family:地址族,可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
Type:套接字类型,可以是 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)或者 SOCK_STREAM(流式套接字,主要用于 TCP 协议)
3. udp网络程序-发送、接收数据
import socket
def main():
# 1. 创建udp socket套接字对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 通过udp socket发送消息
# 2.1 准备目标主机的ip地址和端口号
dest_addr = ("192.168.236.129",8080)# 是一个元组类型,第一个元素是字符串,是目标主机的ip的地址,第二个元素是整数 ,是目标主机的进程的端口号
# 2.2 取得要发送的数据
send_data = input("请输入要发送的数据:")
# 2.3 发送数据到目标主机
udp_socket.sendto(send_data.encode("utf-8"), dest_addr)# 第一个参数是要发送的数据,第二个参数是目标主机地址
# 3. 等待从目标主机回传的消息 ,它是阻塞状态
recv_data = udp_socket.recvfrom(1024)# buffersize : 缓存的大小,一次最多接收多少字节的数据
# 4. 显示接收到的消息
# 回传的消息: (b'good', ('192.168.236.129', 8080))# 元组类型,第一个元素是回传的消息 ,第二个是目标主机的ip和端口
recv_info=recv_data[0].decode("utf-8")# 解码,把字节串转换为字符串
recv_addr=str(recv_data[1])
print("接收到的消息:%s ,消息来自于:%s"%(recv_info,recv_addr))
# 5. 关闭socket套接字
udp_socket.close()
if__name__ =='__main__':
main()
4. udp绑定端口问题
一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定,但是如果需要做成一个服务器端的程序的话,是需要绑定的。
绑定示例:
import socket
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.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()
5.总结
一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化;也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的。