Socket网络编程之面向无连接的传输服务UDP协议

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

启动服务端
在这里插入图片描述
启动客户端,连接成功后每隔两秒接收一条消息。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值