基于udp套接字的服务端
1.创建数据报套接字
sockfd = socket(AF_INIT,SOCK_DGRAM)
2.绑定地址
sockfd.bind(addr)
3.消息的收发
data, addr = sockfd.recvfrom(buffersize)
功能:接受udp消息
参数:每次最多接受多大的消息
返回值:data 接收到的数据
addr 消息发送端的地址
*一次接收一个数据报,如果数据报大小大于buffersize则会丢失部分消息
sockfd.sendto(data,addr)
功能:发送udp消息
参数:data 发送的消息 bytes格式
addr 目标地址
返回值:发送的字节数
4.关闭套接字
sockfd.close()
# udp_server.py
from socket import *
# 创建数据报套接字
sockfd = socket(AF_INET, SOCK_DGRAM)
# 绑定
server_addr = ('0.0.0.0', 8888)
sockfd.bind(server_addr)
# 消息收发
while True:
data, addr = sockfd.recvfrom(1024)
print('recreive from %s:%s' %
(addr, data.decode()))
sockfd.sendto('收到你的消息是'.encode(), addr)
sockfd.close()
基于udp套接字的客户端
1.创建数据报套接字
sockfd = socket(AF_INIT,SOCK_DGRAM)
2.消息收发
sockfd.sendto(data.encode(), ADDR)
sendall(data), addr = sockfd.recvfrom(1024)
3.关闭套接字
# udp_client.py
from socket import *
import sys
if len(sys.argv) < 3:
print('''
argv is <error></error>
run as
python3 udp_client.py 127.0.0.1 8888
''')
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)
sendall(data), addr = sockfd.recvfrom(1024)
print('从服务器收到:', data.decode())
sockfd.close()
cookie:
ays.argv属性
功能:获取命令行参数,得到一个列表
命令本身是argv[0]
后面的参数是从argv[1]开始,默认以空格分隔
使用引号引起来的内容算是一个整体
命令行参数都以字符串放入列表
cookie2:
在程序的第一行加
#!/usr/bin/env python3
添加程序的执行权限
chmod 755 file.py
修改后即可通过 ./file.py 运行程序
tcp套接字编程和udp套接字编程的区别:
1.流式套接字使用字节流的方式传输,数据报套接字以数据报的形式传输数据
2.tcp会有粘包现象,udp有消息边界不会形成粘包
3.tcp可以保障数据传输完整性,udp不保证
4.tcp需要进行listen accept操作,udp不需要
5.tcp收发消息使用新的套接字,recv send, udp 使用recvfrom,sendto
补充函数:
sendall(data)
功能:发送tcp消息
参数:要发送的内容,bytes格式
返回值: 成功返回 None 失败产生异常
套接字对象
s代表一个套接字
s.family :获取套接字的地址族类型
s.type: 获取套接字类型
s.getsockname() : 获取套接字的绑定地址
s.fileno() : 获取套接字的文件描述符
文件描述符:每一个IO事件操作系统都会分配一个不同的正整数作为编号,该正整数即为这个IO的文件描述符
*文件描述符是操作系统识别IO的唯一标志
stdin--->0
stdout--->1
stderr--->2
s.getpeername():获取客户端连接套接字的对应地址
s.setsockopt(level,option,value)
功能:设置套接字选项,丰富或者修改套接字属性功能
参数:level选项类别 SOL_SOCKET
option:具体选项
value :选项值
s.getsockopt(level,option)
功能:设置套接字选项,丰富或者修改套接字属性功能
参数:level选项类别 SOL_SOCKET
option:具体选项
返回值:选项值
*如果要设置套接字选项,最好在创建套接字之后立即设置
udp 应用之广播
广播: 一点发送,多点接收
广播地址: 一个网段内有一个指定的广播地址,是该网段的最大地址
10.8.44.255
广播风暴:一个网段中有大量的广播
# broadcast_set.py
from socket import *
from time import sleep
# 设置目标地址
dest = ('10.8.44.255', 10000)
s = socket(AF_INET, SOCK_DGRAM)
# 设置能够发送广播
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
while True:
sleep(2)
s.sendto('来啊,快活啊'.encode(), dest)
s.close()
# broadcast_resv.py
from socket import *
# 创建套接字
s = socket(AF_INET, SOCK_DGRAM)
# 设置套接字可以发送接收广播
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
# 绑定一个固定端口
s.bind(('0.0.0.0', 10000))
while True:
try:
msg, addr = s.recvfrom(1024)
print('从{}获取信息:{}'.
format(addr, msg.decode()))
except (KeyboardInterrupt, SyntaxError):
raise
except Exception as e:
print(e)
s.close()