16.基于udp协议的socket通信
import socket
server=socket.socket(type=socket.SOCK_DGRAM)
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp不会出现粘包现象,但发送长度有限制
最大512 发多了容易出现丢包
不可靠的数据连接 先启动哪一端都不会报错 用于qq微信 可用于开启多个客户端
为什么udp不会有粘包现象
你发一个我接收一个(一一对应) 不会产生粘包
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sp=input('121313').encode('utf-8')
phone.sendto(sp,('127.0.0.1',8080))#发送sendto
msg,addr=phone.recvfrom(1024)
print(msg.decode('utf-8'),addr)
phone.close()
发送过大 接收小没有缓冲区就会丢包(windows直接报错)
sock_DGRAMsok
DGRAM datagram#数据报文
发送sento (发送的信息,发送给的地址)
接收revefrom
msg,addr=recvfrom(1024)
msg.decode(1024)
客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 基于网络的UDP协议的socket
while 1:
to_server_data = input('>>>:').strip()
client.sendto(to_server_data.encode('utf-8'),('192.168.14.198',9000))
#发送消息的时候要带上发送的地址
# data,addr = client.recvfrom(1024)
# print(f'来自服务端{addr}消息:{data.decode("utf-8")}')
服务端
#服务端只能被动的接收客户端的消息
#客户端发消息的时候还会自带地址
# 回复消息的时候要把对方的地址填写上
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#udp
server.bind(('127.0.0.1',8080))
msg,addr=server.recvfrom(1024)
print(msg.decode('utf-8'),addr)
server.sendto(b'121',addr)
server.close()
tcp和udp的区别:
1.基于 udp协议的socket无需建立管道,先开启服务端或者客户端都行
2.基于udp 协议的socket接收一个消息,与发送一个消息都是无连接的
服务端开启之后没有连接
3.只要拿到我的ip地址和端口就都可以给我发信息,我按照顺序接收消息