基于UDP的编程

佐手、 提交于 2020-01-28 07:52:00

【基于upd的服务端】

  1. 创建套接字—>数据报套接字
    sockfd = socket(AF_INET,SOCK_DGRAM)

  2. 绑定服务端地址
    sockfd.bind()

  3. 消息的收发
    data = recvfrom(buffersize)
    功能:接收UDP消息
    参数:每次最多接收消息的大小
    返回值:接收到的内容
    接收到的消息的发送者
    注意:
    recvfrom一次接收一个数据包,如果数据包超出了一次能接收的大小则会丢失没有收到的内容
    sendto(data,addr)
    功能:udp发送消息
    参数:data 要发送的内容 bytes(要求用bytes格式)
    addr 消息要发送给谁
    返回值:发送的字节

  4. 关闭套接字
    sockfd.close()

  5. 补充
    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']
    
  6. 示例代码:

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数据报套接字使用区别】

  1. 流式套接字采用字节流的方式传输,而数据报套接字以数据包形式传输

  2. tcp会产生粘包现象,udp不会

  3. tcp编程保证数据传输的可靠性,udp则不保证

  4. tcp需要listen accecp,udp不需要

  5. tcp使用recv send进行消息收发,udp使用recvfrom和sendto

   
【补充】
sendall()
功能:同send
参数:同send
返回值:发送成功返回None,发送失败返回异常

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!