当前位置: 首页 > news >正文

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

七层协议

在这里插入图片描述
① 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或其他协议。

总结

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GBase 8s数据库学习积累(2)
  • Android Audio
  • 餐厅点餐系统
  • python中在字符串前所加的字母r““、f““、b““、u““的含义
  • 2024年游泳耳机哪个牌子好?四大热门游泳耳机多维测评盘点!
  • kotlin adapter赋值失效
  • 【QT文件操作】---xml文件读取
  • Flat Ads:全球金融应用现状与发展趋势深度解析
  • [创业之路-138] :产品需求、产品研发、产品生产、库存管理、品控、售后全流程 - 时序图
  • linux下的oracle启动命令
  • 今年奥运会的场馆设计,竟然藏着这样的黑科技!
  • 反欺诈技术发展的现状与未来预测
  • VS2022 Cmake项目构建 Qt
  • 代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础
  • SolarMarker 正在使用水坑攻击与伪造的 Chrome 浏览器更新进行攻击
  • hexo+github搭建个人博客
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • create-react-app做的留言板
  • Javascripit类型转换比较那点事儿,双等号(==)
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SQLServer插入数据
  • vue-loader 源码解析系列之 selector
  • 从重复到重用
  • 对象引论
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前言-如何学习区块链
  • 如何在 Tornado 中实现 Middleware
  • 删除表内多余的重复数据
  • 世界上最简单的无等待算法(getAndIncrement)
  • 为视图添加丝滑的水波纹
  • 小而合理的前端理论:rscss和rsjs
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 7行Python代码的人脸识别
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ‌JavaScript 数据类型转换
  • # include “ “ 和 # include < >两者的区别
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读30/100)Convolutional Pose Machines
  • (十三)Flask之特殊装饰器详解
  • (一)基于IDEA的JAVA基础1
  • (转)重识new
  • *Django中的Ajax 纯js的书写样式1
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 流——流的类型体系简单介绍
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [8] CUDA之向量点乘和矩阵乘法
  • [android] 看博客学习hashCode()和equals()
  • [Avalon] Avalon中的Conditional Formatting.