基于udp套接字的客户端和服务端的建立, udp和tcp套接字编程的区别, udp广播

基于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()

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值