Python学习 Day61 基于UDP协议的Socket编程 01

news/2024/5/18 11:52:34 标签: python, udp, tcp/ip

Socket

一、通信

(一)本地进程间的通信

同台机器不同进程之间的提高方式有多种如:

1.队列

2.同步(互斥锁、条件变量等)

(二)网络进程之间的通信

1.如何唯一标识一个进程(本地PID、网络IP+传输协议+端口
2.socket(套接字)是实现不同主机进程之间的通讯方式


二、Socket编程

(一)创建Socket

语法

socket.socket(AddressFamily,Type)
  • Address Family(常用):可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程 间通信)
  • Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
import socket #python内置模块

#创建套接字(Socket) TCP协议
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#创建套接字(Socket) UDP协议
s2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

print(s1)

(二)基于UDP协议的Socket编程

1.UDP客户端

  • (1)使用socket(),生成套接字描述符;
  • (2)通过host_post 结构设置服务器地址和监听端口;
  • (3)向服务器发送数据,sendto() ;
  • (4)关闭套接字,close() ;

注意:传输协议选择的是UDP协议,无法保证数据的完整性和成功发送

from socket import *

#创建一个UDP协议的套接字,发送一条数据到网络上的另外一个进程

#1.创建套接字
client_socket = socket(AF_INET,SOCK_DGRAM)

#2.定义一个接受信息的目标,8080是一个目标服务器的端口,127.0.0.1是目标服务器地址
# server_host_port = ('127.0.0.1',8080) 可以写IP地址也可以写域名
server_host_port = ('127.0.0.1',8090)

#3.准备即将发送的数据 encode表示按照一种编码格式把数据变成字节数组bytes
# 数据一定是字节数据才能对外发布
datas = input('请输入:').encode('utf-8')

#4.发送数据,标识一个地址是通过IP+端口+协议
client_socket.sendto(datas,server_host_port)

print('发送完成')

#5.关闭套接字,其实就是释放了系统资源
client_socket.close()

在这里插入图片描述

2.UDP服务器端

  • (1)使用函数socket(),生成套接字描述符;
  • (2)通过host_post 结构设置服务器地址和监听端口;
  • (3)使用bind() 函数绑定监听端口,将套接字文件描述符和地址类型变量(host_post)进行绑定;
  • (4)接收客户端的数据,使用recvfrom() 函数接收客户端的网络数据;
  • (5)关闭套接字,使用close() 函数释放资源;
from socket import *

#1.创建一个服务端的socket
scoket_server = socket(AF_INET,SOCK_DGRAM)

#2.定义服务器端的IP地址和端口号
host_port = ('127.0.0.1',8090) #IP地址为本机地址,端口号可自定义(>6000)

#3.服务器端的socket绑定地址和窗口,只有绑定了地址和端口才能称之为服务器的socket
scoket_server.bind(host_port)

#4.接受客户端发送过来的数据,每次接受1KB的数据
#收到的每一个数据报都是元组,第一个值为数据内容,第二个值为源地址和源端口号
data = scoket_server.recvfrom(1024)
print(data[0].decode('utf-8'))
print(data)

#5.关闭套接字,释放资源
scoket_server.close()

任何客户端,必须连接到其他的服务器,进行交互响应,才能完成动态信息交互

客户端
在这里插入图片描述
服务器端
在这里插入图片描述

三、UDP的echo代码

echo服务是一种非常有用的用于调试和检测的工具。该协议接收到什么原样发回,类似于日常生活中的“回声”,即存在回显

(一)客户端的echo代码

from socket import *
'''
需求:
- 1.客户端可以发送多条数据
- 2.客户端如果发送一个“exit”则客户端退出,释放资源
- 3.服务器端收到什么就返回什么
'''
#定义变量,是否退出客户端的标记
flag = True

#1.创建套接字
client_socket = socket(AF_INET,SOCK_DGRAM)

while flag:
    #2.定义一个接受信息的目标,8080是一个目标服务器的端口,127.0.0.1是目标服务器地址
    # server_host_port = ('127.0.0.1',8080) 可以写IP地址也可以写域名
    server_host_port = ('127.0.0.1',8090)

    #3.准备即将发送的数据 encode表示按照一种编码格式把数据变成字节数组bytes
    # 数据一定是字节数据才能对外发布
    datas = input('请输入:').encode('utf-8')

    #4.发送数据,标识一个地址是通过IP+端口+协议
    client_socket.sendto(datas,server_host_port)

    #一定可以从服务器接收到返回过来的数据,打印服务器返回的数值
    print("返回的数值是:",client_socket.recvfrom(1024)[0].decode('utf-8'))

    if (datas.decode('utf-8')) == "exit": #注意datas为字节数据,所以要将其转为字符串
        flag = False

#5.关闭套接字,释放系统资源
client_socket.close()

(二)服务器端的echo代码

from socket import *

#1.创建一个服务端的socket
scoket_server = socket(AF_INET,SOCK_DGRAM)

#2.定义服务器端的IP地址和端口号
host_port = ('',8090) #如果服务器是真实的物理小型服务器,IP地址有很多。任何本机的IP地址都绑定使用“空字符串”

#3.服务器端的socket绑定地址和窗口,只有绑定了地址和端口才能称之为服务器的socket
scoket_server.bind(host_port)

while True:
    data = scoket_server.recvfrom(1024)
    #服务器收到数据之后原封不动返回,而且是收到哪个客户端的信息就返回给哪个客户端
    scoket_server.sendto(data[0],data[1])
    print(data[0].decode('utf-8'))

#5.关闭套接字,释放资源
scoket_server.close()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、UDP客户端和服务器端的区分

  • udp的服务器和客户端的区分:往往是通过请求服务提供服务来进行区分
  • 请求服务的一方称为:客户端
  • 提供服务的一方称为:服务器
  • 一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
  • 客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

http://www.niftyadmin.cn/n/837360.html

相关文章

51nod 挑剔的美食家

挑剔的美食家 基准时间限制:1 秒 空间限制:131072 KB 分值: 5与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了。现在,Farmer John不得不去牧草专供…

Python学习 Day62 基于TFTP协议的Socket编程 02

一、TFTP协议 1.概念 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 2.特点 简单占用资源小适合传递小文件适合在局域网进行传递端口号为69基于UDP实现 3.信息交互…

根据需要得字符串长度截取字串

#region 功能描述:根据需要得字符串长度截取字串 /// <summary> /// 根据需要得字符串长度除去字串 /// </summary> /// <param name"str">字符串</param> /// <param name"len">需要字串长度</param>…

新手小白昨天成功的把自己绕进去了。今天从头复习,希望可以找到小伙伴一起成长。华为路由基本命令...

华为路由器&#xff1a;配置命令、模拟操作模式介绍&#xff1a;华为路由器有四种模式&#xff1a;1、用户视图&#xff08;查看各种配置&#xff09;2、系统视图&#xff08;各种操作&#xff0c;主要学习视图&#xff09;3、接口视图&#xff08;各个端口的配置&#xff09;4…

CocoaPods 的简单快速安装方法

CocoaPods 的简单快速安装方法(Setting up CocoaPods master repo 卡着不动&#xff0c;是因为淘宝镜像已经不能用了。 一、git clone方法安装cocoapods 镜像实在太多坑了&#xff0c;琢磨了一下另一种安装cocoapods的方法。在终端中&#xff0c;进入该目录。若没有以上目录&am…

Dancing Links算法(舞蹈链)

原文链接&#xff1a;跳跃的舞者&#xff0c;舞蹈链&#xff08;Dancing Links&#xff09;算法——求解精确覆盖问题 作者&#xff1a;万仓一黍 出处&#xff1a;http://grenet.cnblogs.com/ 本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保…

Python学习 Day63 IPython安装及使用 01

IPython的安装及使用 一、简介 ipython是python的一个交互式shell&#xff0c;比默认的“python shell”更方便&#xff0c;支持变量自动补全&#xff0c;自动缩进&#xff0c;支持bash shell命令&#xff0c;内置了许多强大的功能和函数。 IPython是基于BSD开源的&#xff…

checkbox全选和全反选

<script language"javascript"> ///设置全选 function SelectAllCheckboxes(spanChk,chkboxname){ var oItem spanChk.children; var theBox(spanChk.type"checkbox")?spanChk:spanChk.children.item[0]; xStatetheBox.checked; …