网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)

news2024/11/24 22:56:57

七层协议

在这里插入图片描述
① ip协议
在这里插入图片描述

②TCP协议

TCP协议面向连接的,可靠的协议,有三次握手来保证可靠性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③ udp协议
不一定可以保证数据发过去,像发短信一样,对方不一定在线,号码也不一定对
在这里插入图片描述
TCP,UDP之间存在一些区别

在这里插入图片描述

端口号是什么?

在这里插入图片描述


在python中如何实现网络通信程序的编写?

用socket类:用来描述IP地址和端口号

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

TCP编程

包括

  • ①TCP服务器端编程
  • ②客户端编程
    启动时先启动服务器端,开始等待监听,再启动客户端,需要注意在python文件创建时候两个文件需要写在不同的项目里

在这里插入图片描述

①TCP服务器端编程(接受数据)

在这里插入图片描述

服务器套接字(Server Socket) 是计算机网络编程中的一个重要概念,它是用于网络通信的一种抽象数据结构,主要用于在服务器端监听和接受来自客户端的连接请求

服务器套接字的工作机制通常涉及以下几个步骤:

  • 创建套接字:服务器程序首先创建一个套接字对象,并指定其类型(如TCP或UDP)和协议族(如IPv4或IPv6)。
  • 绑定地址和端口:将套接字绑定到服务器的IP地址和端口号上,以便监听来自该地址和端口的连接请求。
  • 监听连接:调用监听函数(如listen()),使套接字进入监听状态,等待客户端的连接请求。
  • 接受连接:当接收到客户端的连接请求时,服务器套接字通过接受函数(如accept())接受连接,并创建一个新的套接字来与客户端进行通信。
  • 数据交换:通过新创建的连接套接字,服务器与客户端进行数据的发送和接收。

例如:在Python中,使用socket库可以很方便地编写服务器端代码。以下是一个简单的TCP服务器示例,该服务器监听来自客户端的连接,接收客户端发送的消息,并将接收到的消息回发给客户端。

#首先,你需要导入Python的socket库
import socket  
  
def start_server(host='127.0.0.1', port=8888):  
	#使用socket.socket()函数创建一个socket对象。
	#对于TCP连接,通常使用AF_INET(IPv4)和SOCK_STREAM(流式socket,即TCP)。
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    #使用bind()方法将socket绑定到特定的IP地址和端口上。
    #在大多数情况下,服务器会监听所有可用的网络接口(使用''或0.0.0.0作为IP地址),并选择一个未被占用的端口。
    server_socket.bind((host, port))  
    #使用listen()方法让服务器监听连接。这个方法指定了服务器可以同时处理的最大连接数(即“backlog”队列的大小)。
    server_socket.listen(5)  
  
    print(f"服务器启动,监听 {host}:{port}")  
  
  #服务器通过无限循环不断接受客户端的连接。
  #accept()方法会阻塞,直到一个连接到达。它返回一个元组,包含一个新的socket对象(用于与客户端通信)和客户端的地址。*斜体样式*
    while True:  
        client_socket, addr = server_socket.accept()  
        print(f"连接地址: {addr}")  
  
        try:  
            while True:  
            #这行代码尝试从client_socket(一个已经建立的TCP连接)接收最多1024字节的数据。
            #.recv(1024)方法返回接收到的原始字节数据,然后通过.decode()方法将其解码为字符串,以便可以打印和进一步处理。
                data = client_socket.recv(1024).decode('utf-8')  
                if not data:  
                    break  
                print(f"收到: {data}")  
                #在将数据打印到控制台之后,这行代码将相同的数据(但这次作为字节数据,通过data.encode()转换)发送回客户端。
                #注意,这在实际应用中可能不是一个好主意,因为它会创建无限的数据回环(除非客户端在发送新数据之前关闭连接或发送某种特定的结束信号)。
                client_socket.sendall(data.encode('utf-8'))  
        finally: 
        #无论try块中的代码是否成功执行或是否发生异常,finally块中的代码都会执行。
        #这确保了client_socket最终会被关闭,释放了与之关联的资源。 
            client_socket.close()  
  
if __name__ == "__main__":  
    start_server()

实际上,在大多数情况下,您不需要(也不应该)在客户端连接处理循环中显式关闭 server_socket。server_socket 是用来监听来自客户端的连接请求的,只要服务器还在运行并希望接受新的连接,它就应该保持打开状态。
关闭服务器通过调用 server_socket.close() 来实现,但这应该是不再需要接受任何新的连接时进行的。

①TCP客户端编程

在这里插入图片描述

# client.py  
import socket  
  
# 创建 socket 对象  
client_socket = socket.socket()  
  
# 获取本地主机名  
host = '127.0.0.1' 
  
port =8888
  
# 连接服务,.connect里边是元组,指定要连接的服务器ip和端口  
client_socket.connect((host, port))  
  
# 发送数据  
message = '你好,服务器!'  
client_socket.send(message.encode('utf-8'))  
  
# 接收小于 1024 字节的数据  
#data = client_socket.recv(1024).decode('utf-8')  
  
print('来自服务器的数据:', data)  
  
# 关闭连接  
client_socket.close()

UDP编程

面向无连接,这意味着在发送数据之前不需要建立连接。服务器和客户端都可以随时发送数据到对方,但是它们必须知道对方的IP地址和端口号。

在这里插入图片描述
UDP 服务器接收

import socket  
  
def udp_server(host='127.0.0.1', port=12345):  
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:  
        s.bind((host, port))  
        print(f"UDP server listening on {host}:{port}")  
  
        while True:  
            data, addr = s.recvfrom(1024)  # 缓冲区大小  
            print(f"Received {data.decode('utf-8')} from {addr}")  
  
            # 处理数据(这里只是简单地将数据转换为大写)  
            response = data.decode('utf-8').upper().encode('utf-8')  
  
            # 发送响应回客户端  
            s.sendto(response, addr)  
  
if __name__ == "__main__":  
    udp_server()

UDP 客户端

import socket  
  
def udp_client(server_host='127.0.0.1', server_port=12345):  
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:  
        while True:  
            message = input("Enter message (or 'quit' to exit): ")  
            if message.lower() == 'quit':  
                break  
  
            # 发送消息到服务器  
            s.sendto(message.encode('utf-8'), (server_host, server_port))  
  
            # 接收服务器的响应  
            data, server = s.recvfrom(1024)  
            print(f"Received from server: {data.decode('utf-8')}")  
  
if __name__ == "__main__":  
    udp_client()

由于UDP是无连接的,因此服务器和客户端之间的通信是独立的,没有建立或断开连接的明确过程。此外,UDP不保证数据包的顺序、完整性或可靠性,因此在需要这些特性的应用中,可能需要使用TCP或其他协议。

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSocket编程

一、JavaSocket编程 1.1HTTP协议 后端原理 2. 特点 同步:就是两个任务执行的过程中,其中一个任务要等另一个任务完成某各阶段性工作才能继续执行,如厨师A炒番茄,将葱花放入锅中,然后需要放入番茄,但是厨…

【计算机系统基础读书笔记】1.1.3 程序和指令的执行过程

冯诺依曼结构计算机的功能通过执行程序实现,程序的执行过程就算所包含的指令的执行过程。 指令(instruction)是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作。 指令(instruction)在计算机科…

Redis 键值型数据库

一、Redis是什么 Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据 库,基于内存…

悟空大爆,OZON有哪些悟空产品推荐

Top1 减压玩具 Электронный поп ит пикачу Pop It антистресс 商品id:1592564066 月销量:811 OZON有哪些悟空产品,详情看工具:D。DDqbt。COm/74rD 此款减压玩具以其独特的设计,为…

保姆级教程!奶奶都能学会的Mac本地部署Stable Diffusion教程

一、为什么选择Stable-diffusion 举一个简单的例子,Midjourney和Stable diffusion在照片处理领域就好比是“美图秀秀”和“PS”;在短视频制作领域,就好比是“剪映”和“PR”。 这样说是不是更容易理解了,如果你是新手只想单纯的…

最高身高(c语言)

1.//描述 //KiKi想从n行m列的方阵队列中找到身高最高的人的位置,请你帮助他完成这个任务。 // //输入描述: //第一行包含两个整数n和m,表示这个方阵队列包含n行m列。从2到n 1行, // 每行输入m个整数(范围 - 231~231 -…

当黑神话遇上AI:悟空背后的策划逆袭战

声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2192.html 哈喽,亲爱的游戏迷,随着《黑神话:悟空》的上线,大家都在忙着“直面天命”了吧?今天我想和大家分享最…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容,微博用户主页内容以及导出爬取到的微博数据等操作,那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

linux笔记1

命令格式 命令行界面的提示符解析: [rootlocalhost ~]# root位置: 登录用户名 : 连接符号 localhost位置: 本机的主机名 ~位置: 当前的所在位置 #位置: 表示是超级管理员还是普通用户 超级管…

Cesium 自定义MaterialProperty原理解析

MaterialProperty是一个抽象接口类,它定义了Entity图元的材质要实现的属性和函数。这些属性和函数主要是cesium 内部调用,用于减少cesium 内部对材质的重复创建和缓存,减少内存开销。 1. Property 类 Property类是所有属性的抽象接口类&…

B2B⼤宗电商交易系统功能案例分析

B2B大宗电商交易系统是构建高效、安全、可扩展电子商务平台的重要基石。以下是对该系统后端架构与关键功能的详细解析: 后端架构 B2B大宗电商交易系统的后端架构通常涉及多个关键组件和技术,以确保系统的稳定运行和高效处理。主要组成部分包括&#xff…

UE4编安卓时Core模块为何只include Android文件夹?

Core模块 Core模块是整个引擎中最核心的模块。几乎UE4中的每个其他模块都导入Core。Engine\Source\Runtime\Core\Private下有很多文件夹&#xff0c;下面罗列一部分&#xff1a; G:\St\EngineSource\Engine\Source\Runtime\Core\Private 的目录 2024/07/18 12:02 <DIR…

AOC U27U2P创作设计旗舰——传递情感,用色彩说话!

摘要&#xff1a;每一次设计都是一种表达&#xff0c;每一次创作都是一次成长 并不是所有的路在一开始走的时候&#xff0c;都能找到正确的方向。对于设计师而言&#xff0c;在创作与设计的道路上&#xff0c;亦是如此。灵感的枯竭、无休止的改稿、色彩的偏差等等&#xff0c;…

基于springboot的校园失物招领系统--论文pf

TOC springboot483基于springboot的校园失物招领系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人…

Linux yum提示Error downloading packages

很明显的错误&#xff0c;没有考虑过磁盘空间&#xff0c;记录一下。 Error downloading packages:gcc-4.8.5-44.el7.x86_64: Insufficient space in download directory /var/cache/yum/x86_64/7/base/packages* free 0 * needed 16 M使用du查看当前目录下所有文件大小 du …

mac安装ipa包【金铲铲为例】

mac安装ipa包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

Python办公自动化 python-pptx模块的安装与使用【1】

学好办公自动化&#xff0c;走遍天下都不怕&#xff01;&#xff01; 前面已经学习了python自动处理Excel数据和自动生成word试卷的案例&#xff0c; 今天学习一下python中的python-pptx模块&#xff0c;主要用于自动化生成和更新PPT文件。主要是python-pptx的用法&#xff0c;…

react 的学习随记

npx create-react-app my-app 创建一个名叫my-app的react的项目 npm run eject 运行 显示config 文件夹 react jsx &#xff08;使用时将babel 将jsx转为js&#xff09; 单页面时需要引用 1&#xff0c;样式&#xff08;在虚拟dom时&#xff09; 1. 引用样式时 用classNa…

(第三十三天)

1. 设置主从从 mysql57 服务器 &#xff08; 1 &#xff09;配置主数据库 [rootmsater_5 ~] # systemctl stop filewalld [rootmsater_5 ~] # setenforce 0 [rootmsater_5 ~] # systemctl disable filewalld [rootmsater_5 ~] # ls anaconda-ks.cfg mysql-5.7.44-linux-g…

解决STM32使用J-Link可以擦除和读取但是无法烧录问题

现象 使用J-Link烧录模组固件&#xff0c;出现可以读取和擦除&#xff0c;但是无法烧录问题&#xff0c;提示错误如下&#xff1a; ERROR: Programming failed address 0x08000080 (program error)End of flash programmingERROR: Program failed 读出来的时候这个地址数据…