我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python3--socket编程(udp协议)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python3--socket编程(udp协议)

基于UDP协议的socket

udp是无连接的,启动服务之后可以直接接受消息,不需要提前建立连接,UDP必须是server端先接受消息


简单版

server端代码

import socket

# 创建一个服务器的套接字基于udp,type=socket.SOCK_DGRAM表示使用udp协议
udp_sk = socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(('127.0.0.1', 9555))  # 绑定服务器的ip和端口的套接字

# udp协议不用建立连接
msg, addr = udp_sk.recvfrom(1024)  # 接收1024字节的消息 msg表示内容,addr表示ip和端口
print(msg.decode('utf-8'))
udp_sk.sendto('hello'.encode('utf-8'), addr)  #发送消息,需写入对方的ip和端口
udp_sk.close()


client端代码

import socket

ip_port = ('127.0.0.1', 9555)  # 服务器的ip与端口

# 创建一个服务器的套接字,基于udp协议 type=socket.SOCK_DGRAM
udp_sk = socket.socket(type=socket.SOCK_DGRAM)

# 发送消息并编码成utf-8,需要传ip和端口
udp_sk.sendto('你好吗'.encode('utf-8'), ip_port)

# 接收1024字节的消息 加 ip+端口
back_msg, addr = udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'), addr)
udp_sk.close()


先运行server,再运行client

server执行结果

你好吗


client执行结果

hello ('127.0.0.1', 9555)



怎么改成手动输入,多人聊天?

server端代码

import socket

# 创建一个服务器的套接字基于udp,type=socket.SOCK_DGRAM表示使用udp协议
udp_sk = socket.socket(type=socket.SOCK_DGRAM)

udp_sk.bind(('127.0.0.1', 9555))   # 绑定服务器的ip和端口的套接字
while True:
    # udp协议不用建立连接
    msg, addr = udp_sk.recvfrom(1024)  # 接收1024字节的消息 msg表示内容,addr表示ip和端口
    print(msg.decode('utf-8'))
    inp = input('>>>').strip().encode('utf-8')
    udp_sk.sendto(inp, addr)  # 发送消息,需写入对方的ip和端口

udp_sk.close()


client端代码

import socket

ip_port = ('127.0.0.1', 9555)  # 服务器的ip与端口

# 创建一个服务器的套接字,基于udp协议 type=socket.SOCK_DGRAM
udp_sk = socket.socket(type=socket.SOCK_DGRAM)

while True:
    # 发送消息,需要传ip和端口
    inp = input('>>>').strip()
    if inp == 'q':  # 判断当内容为q的时候,跳出循环,退出程序
        break
    udp_sk.sendto(inp.encode('utf-8'), ip_port)

    # 接收1024字节的消息 加 ip+端口
    back_msg, addr = udp_sk.recvfrom(1024)
    print(back_msg.decode('utf-8'))
udp_sk.close()


先运行server,再运行client两次(模拟多人),运行结果

download.gif


socket基于UDP协议,如果是2个客户端,都向server发送消息,那么server对于client,还是有优先顺序的(谁发送的数据,被server接受到,那么就先回复谁(网络延迟,带宽...的影响,并不是先发送就先收到))



socket(基于UDP协议)进阶聊天版--加上和不同人名通信(不同颜色)

选运行server,在运行client两次(模拟多个用户)

server端代码

import socket

# 创建一个服务器的套接字基于udp,type=socket.SOCK_DGRAM表示使用udp协议
udp_sk = socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(('127.0.0.1', 9555))   # 绑定服务器的ip和端口的套接字
lst = {'sam': '\033[1;31m', 'tom': '\033[1;34m'}  # 对不同人设置不同颜色

while True:
    # udp协议不用建立连接
    msg, addr = udp_sk.recvfrom(1024)  # 接收1024字节的消息 msg表示内容,addr表示ip和端口
    name, mesg = msg.decode('utf-8').split(':')
    color = lst.get(name.strip(), '')
    print('{}{}\033[0m'.format(color, msg.decode('utf-8')))
    inp = input('>>>').strip().encode('utf-8')
    udp_sk.sendto(inp, addr)  # 发送消息,需写入对方的ip和端口

udp_sk.close()


client端代码

import socket

ip_port = ('127.0.0.1', 9555)  # 服务器的ip与端口

# 创建一个服务器的套接字,基于udp协议 type=socket.SOCK_DGRAM
udp_sk = socket.socket(type=socket.SOCK_DGRAM)
name = input('>>>').strip()
while True:
    # 发送消息,需要传ip和端口
    inp = input('>>>').strip()
    if inp == 'q':  # 判断当内容为q的时候,跳出循环,退出程序
        break
    udp_sk.sendto('{} : {}'.format(name, inp).encode('utf-8'), ip_port)

    # 接收1024字节的消息 加 ip+端口
    back_msg, addr = udp_sk.recvfrom(1024)
    print(back_msg.decode('utf-8'))
udp_sk.close()


运行结果

download.gif



每次发消息需要encode,接收消息需要decode,这样很麻烦?怎么做可以省去这些步骤?,这个时候可以自定义一个类,继承了socket类,能够实现高可用,定制需求

创建一个mysocket.py文件,内容如下

from socket import *   #从socket模块中导入所有方法

class Mysocket(socket):  # 继承socket类
    def __init__(self, coding='utf-8'):
        self.coding = coding  # 使用默认参数,设置字符编码 utf-8
        super().__init__(type=SOCK_DGRAM)  # 执行父类的__init__方法

    def my_recv(self, num):
        msg, addr = self.recvfrom(num)
        return msg.decode(self.coding), addr  # 接收消息这里解码

    def my_send(self, msg, addr):
        return self.sendto(msg.encode(self.coding), addr)  # 发送消息这么编码


server端代码

from mysocket import Mysocket

sk = Mysocket()
sk.bind(('127.0.0.1', 9090))
while True:
    msg, client_addr = sk.my_recv(1024)  # udp协议不用建立连接
    print(msg)
    inp = input('>>>').strip()
    sk.my_send(inp, client_addr)

sk.close()


client端代码

from mysocket import Mysocket

sk = Mysocket()
while True:
    inp = input('>>>').strip()
    if inp == 'q':break
    sk.my_send(inp, ('127.0.0.1', 9090))
    msg, addr = sk.my_recv(1024)
    if msg == 'q':break
    print(msg)
sk.close()


先运行server,在运行client,执行结果为

download.gif



时间同步服务,基于udp协议完成的

假如有一个标准时间的server服务端,client可以从server获取标准时间。

server端代码

import socket
import time

sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 9090))
while True:
    msg, addr = sk.recvfrom(1024)
    sk.sendto(time.strftime('%Y-%m-%d %H:%M:%S').encode('utf-8'), addr)  # 发送一个格式化时间给client
sk.close()


client端代码

import time

sk = socket.socket(type=socket.SOCK_DGRAM)
while True:
    sk.sendto('time'.encode('utf-8'),('127.0.0.1', 9090))
    ret,addr = sk.recvfrom(1024)
    print(ret.decode('utf-8'))
    time.sleep(2)
sk.close()


先运行server在运行client,效果为

download.gif


查看TCP和UDP的套接字

blob.png


socket参数的详解

socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)

创建socket对象的参数说明:

family地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域实际上是使用本地 socket 文件来通信)
type套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 
SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
proto协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
fileno如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。
与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。
这可能有助于使用socket.close()关闭一个独立的插座。


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python3--socket编程(udp协议)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python3--socket编程(udp协议)

基于UDP协议的socketudp是无连接的,启动服务之后可以直接接受消息,不需要提前建立连接,UDP必须是server端先接受消息简单版server端代码importsocket#创建一个服务器的套接字基于udp,type=socket.
2023-01-30

python3--socket编程(tcp协议)

socket概念socket层理解socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一
2023-01-30

网络编程协议(TCP和UDP协议,粘包问

网络编程协议1.osi七层模型应用层  表示层  会话层  传输层  网络层  数据链路层  物理层2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型3.Tcp和udp协议Tcp协议:面向连接,数据可靠,传输效率低,面向字
2023-01-30

Linux之UDP协议及其编程全流程

目录UDP协议的特点UDP的编程流程UDP接口原型UDP服务器端UDP客户端UDP的报头结构UDP的优势UDP的数据报服务总结UDP协议的特点 UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能
2023-03-23

Linux之UDP协议及编程流程是什么

这篇文章主要讲解了“Linux之UDP协议及编程流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux之UDP协议及编程流程是什么”吧!UDP协议的特点UDP 不提供可靠性的传输
2023-07-05

Java实现基于UDP协议的网络通信UDP编程

在Java中使用UDP编程,仍然需要使用Socket,因为应用程序在使用UDP时必须指定网络接口(IP地址)和端口号。注意:UDP端口和TCP端口虽然都使用0~65535,但他们是两套独立的端口,即一个应用程序用TCP占用了端口1234,不影响另一个应用程序用UDP占用端口1234
2023-05-17

Java Socket如何实现UDP编程

这篇文章主要讲解了“Java Socket如何实现UDP编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Socket如何实现UDP编程”吧!一、概述在 Java 中使用 UDP
2023-07-04

python3网络编程之socket

http://www.cnblogs.com/Bigtre/p/7261387.html
2023-01-31

android开发socket编程之udp发送实例分析

本文实例讲述了android开发socket编程之udp发送实现方法。分享给大家供大家参考。具体分析如下: 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 一、环境: win7
2022-06-06

怎么用Python基于udp协议实现聊天小程序

这篇文章主要介绍“怎么用Python基于udp协议实现聊天小程序”,在日常操作中,相信很多人在怎么用Python基于udp协议实现聊天小程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python基于
2023-06-02

【Python3爬虫】使用异步协程编写爬

进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元。线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源。线程是独立运行和独立调度的基本单元。协程:协程是一种用户态的
2023-01-30

Android编程使用HTTP协议与TCP协议实现上传文件的方法

本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法。分享给大家供大家参考,具体如下: Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Soc
2022-06-06

C++基于socket UDP网络编程如何实现聊天室功能

这篇文章主要介绍C++基于socket UDP网络编程如何实现聊天室功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下0.通信步骤流程图(左:服务器;右:客户端;)1.服务器代码1.1服务器类头文件(CS
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录