欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

udpsocket使用编程(socket通信原理)

程序员文章站 2024-03-27 08:23:10
前言前文使用tcp面向流的套接字,今天讲解的udp的工作方式与tcp/ip不同。udp是用户数据报协议,是一个面向消息的协议。一方面,udp不需要一个长期活动连接,所以建立udp套接字稍微简单一些。另...

前言

前文使用tcp面向流的套接字,今天讲解的udp的工作方式与tcp/ip不同。udp是用户数据报协议,是一个面向消息的协议。

一方面,udp不需要一个长期活动连接,所以建立udp套接字稍微简单一些。另一方面,udp消息必须放在一个数据报中。

在ipv4中,数据报包含65507个字节,这些字节信息中还包括首部信息。因为udp不需要长期的连接,所以它无法得到tcp所能提供的传输保障。

服务器代码

因为udp并没有连接,所以服务器不需要监听和接收连接。它只需要使用bing()将其套接字与一个端口关联,然后等待各个消息。

示例代码如下:

import socket

# 1.创建一个套接字,
sock = socket.socket(socket.af_inet, socket.sock_dgram)
sock.bind(('localhost', 10000))
while true:
    data, address = sock.recvfrom(4096)
    print(data.decode('utf-8'), address)
    if data:
        sent = sock.sendto('已接收到你发来的消息'.encode('utf-8'), address)

其中,recvfrom()表示从套接字读取消息,比如客户但发送消息后,消息与客户但地址都在里面。

至于sendto()很好理解,就是发送消息给别人。参数1表示消息内容,参数2就是发送到哪里(也就是对方的地址)。

客户端代码

客户端当然比服务器更简单,因为udp不需要连接,可以直接将消息发送到服务器,并使用recvfrom()响应。示例如下:

import socket

sock = socket.socket(socket.af_inet, socket.sock_dgram)

try:
    msg = "发送消息到服务器".encode('utf-8')
    sent = sock.sendto(msg, ('localhost', 10000))
    data, server = sock.recvfrom(4096)
    print(data.decode())
finally:
    sock.close()

同样的,这里sock.recvfrom()用于接收服务器反馈的消息内容与地址。运行之后,效果如下所示:

udpsocket使用编程(socket通信原理)
udpsocket使用编程(socket通信原理)