【基于upd的服务端】
-
创建套接字—>数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM) -
绑定服务端地址
sockfd.bind() -
消息的收发
data = recvfrom(buffersize)
功能:接收UDP消息
参数:每次最多接收消息的大小
返回值:接收到的内容
接收到的消息的发送者
注意:
recvfrom一次接收一个数据包,如果数据包超出了一次能接收的大小则会丢失没有收到的内容
sendto(data,addr)
功能:udp发送消息
参数:data 要发送的内容 bytes(要求用bytes格式)
addr 消息要发送给谁
返回值:发送的字节 -
关闭套接字
sockfd.close() -
补充
sys.argv
功能:
获取来自命令行的参数,形成一个(字符串)列表
argv[0]是命令本身,其他内容默认以空格分割放到列表中
示例:import sys print(sys.argv) 终端打印: tarena@tedu:~/pythonweb/day02$ python3 argv.py hello wangtiantian ['argv.py', 'hello', 'wangtiantian'] tarena@tedu:~/pythonweb/day02$ python3 argv.py 'hello python' ['argv.py', 'hello python'] -
示例代码:
udp_server.py
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('Receive from %s:%s' % (addr,data.decode()))
sockfd.sendto('收到你的消息'.encode(),addr)
sockfd.close()
udp_client.py
from socket import *
import sys
if len(sys.argv) < 3:
print('''
argv is error!!!
input as
python3 udp_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()
【tcp流式套接字和udp数据报套接字使用区别】
-
流式套接字采用字节流的方式传输,而数据报套接字以数据包形式传输
-
tcp会产生粘包现象,udp不会
-
tcp编程保证数据传输的可靠性,udp则不保证
-
tcp需要listen accecp,udp不需要
-
tcp使用recv send进行消息收发,udp使用recvfrom和sendto
【补充】
sendall()
功能:同send
参数:同send
返回值:发送成功返回None,发送失败返回异常
来源:CSDN
作者:雨醉东风
链接:https://blog.csdn.net/zhangxuelong461/article/details/104058804