1、特点
(1)不保证可靠的数据传输
(2)没有连接过程
(3)数据收发都比较自由,不会受另一端制约
2、适用情况
(1)网络情况较差,对传输可靠性情形要求不高,需要提升传 输效率的情况
- 比如:网络视频,群聊,发送广播
3、Socket(套接字编程)目的
- 通过编程语言提供的函数接口进行组合,更简单的完成基于TCP或者UDP通信的网络编程
4、套接字分类:
(1)流式套接字(sock_stream):传输层基于tcp的协议进行通信
(2)数据报套接字(sock_dgram):传输层基于udp协议进行通信
(3)底层套接字(sock_ram):访问底层协议的套接字
5、Udp服务端
(1)创建数据报套接字
from socket import socket
sockfd=socket(AF_INET, SOCK_DGRAM)
(2)绑定服务端地址
sockfd.bind((addr, port))
(3)消息发送
sockfd.sendto(data,addr)
- 功能:Udp发送消息
- 参数:data:要发送的内容 bytes
addr:消息要发给谁,来自客户端地址 - 返回值:发送的字节
(4)消息接收
data, addr=Sockfd.recvfrom(buffersize)
- recvfrom一次接收一个数据包,如果数据包超出了一次能够接收的大小,则会丢失没有收到的内容。
- 功能:接收udp消息
- 参数:每次最多接受消息的大小
- 返回值:1、接收到的内容
2、接收到的消息的发送者
(5)关闭套接字
sockfd.close()
6、Udp客户端
(1)创建数据报套接字
from socket import socket
sockfd=socket(AF_INET, SOCK_DGRAM)
(2)设置服务端地址
ADDR=(HOST,PORT)
(2)发送消息
sockfd.sendto(data.encode(),ADDR)
(3)接收消息
data,addr=sockfd.recvfrom(1024)
7、示例演示
(1)服务端
from socket import *
import sys
# 从命令行输入ip和端口
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST, PORT)
# 创建数据报套接字
sockfd = socket(AF_INET, SOCK_DGRAM)
# 绑定地址
sockfd.bind(ADDR)
# 消息的收发
while True:
data, addr = sockfd.recvfrom(1024)
print('收到消息%s:%s'%(addr,data.decode()))
sockfd.sendto("收到消息了".encode(),addr)
sockfd.close()
(2)客户端
from socket import *
import sys
if len(sys.argv)<3:
print('''argv is error!!
input as python3 upd_client.py
127.0.0.1 8888''')
raise
HOST = sys.argv[1]
PORT = int(sys.argv[2])
# 要访问的服务端地址
ADDR = (HOST, PORT)
# 创建套接字
sockfd=socket(AF_INET, SOCK_DGRAM)
while True:
data=input("消息:")
if not data:
break
sockfd.sendto(data.encode(),ADDR)
data,addr = sockfd.recvfrom(1024)
print("收到消息:",data.decode())
sockfd.close()
服务端
客户端1
客户端2
8、udp套接字广播应用示例
(1)服务端
from socket import *
from time import sleep
#广播地址
dest = ('',8000)
s = socket(AF_INET, SOCK_DGRAM)
#设置套接字可以发送接收广播
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1)
while True:
sleep(2)
s.sendto('你好!'.encode(), dest)
s.close()
(2)客户端
from socket import *
sockfd=socket(AF_INET,SOCK_DGRAM)
sockfd.setsockopt(SOL_SOCKET,SO_BROADCAST,1)
sockfd.bind(('',8000))
while True:
try:
msg,addr=sockfd.recvfrom(1024)
print("从{}获取信息:{}".
format(addr,msg.decode()))
except (KeyboardInterrupt,SyntaxError):
raise
except Exception as e:
print(e)
sockfd.close()
启动服务端
启动客户端,连接成功后每隔两秒接收一条消息。