Python常见面试题的详解16

1. 如何强行关闭客户端和服务器之间的连接?

在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议,处理方式相对简单。

服务器端(TCP)

python

import socket# 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))
# 开始监听
server_socket.listen(1)print("Waiting for a connection...")
# 接受客户端连接
conn, addr = server_socket.accept()
print(f"Connected by {addr}")try:# 强制关闭连接# 先禁用读写conn.shutdown(socket.SHUT_RDWR)# 关闭连接conn.close()print("Connection closed.")
except Exception as e:print(f"Error closing connection: {e}")

客户端(TCP)

python

import socket# 创建 TCP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(('localhost', 8888))try:# 强制关闭连接client_socket.shutdown(socket.SHUT_RDWR)client_socket.close()print("Connection closed.")
except Exception as e:print(f"Error closing connection: {e}")

服务器端(UDP)

python

import socket# 创建 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))try:# 停止接收数据并关闭套接字server_socket.close()print("UDP socket closed.")
except Exception as e:print(f"Error closing UDP socket: {e}")
  • 要点
  1. TCP 连接关闭需要先使用 shutdown 方法禁用读写,再调用 close 方法关闭连接。
  2. UDP 连接直接调用 close 方法关闭套接字。
  3. 在实际应用中,强行关闭连接可能会导致数据丢失或未完成的操作中断。因此,在关闭连接之前,最好确保所有必要的数据已经传输完成。另外,对于 TCP 连接,shutdown 方法可以指定不同的参数,如 socket.SHUT_RD 表示关闭读通道,socket.SHUT_WR 表示关闭写通道。

2. 说明 TCP 和 UDP 的区别以及优缺点

TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的传输层协议,它们在连接性、可靠性、有序性、传输效率和首部开销等方面存在明显差异。

python

import socket# TCP 服务器示例
def tcp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 8888))server_socket.listen(1)print("TCP server is listening...")conn, addr = server_socket.accept()data = conn.recv(1024)print(f"Received from {addr}: {data.decode()}")conn.close()# UDP 服务器示例
def udp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_socket.bind(('localhost', 8889))print("UDP server is listening...")data, addr = server_socket.recvfrom(1024)print(f"Received from {addr}: {data.decode()}")server_socket.close()if __name__ == "__main__":import threadingtcp_thread = threading.Thread(target=tcp_server)udp_thread = threading.Thread(target=udp_server)tcp_thread.start()udp_thread.start()
  • 要点

对比项

TCP

UDP

连接性

面向连接,需三次握手建立连接,四次挥手断开连接

无连接,直接发送数据

可靠性

提供可靠传输,有确认、重传、滑动窗口机制

不可靠,可能丢包、乱序

有序性

保证数据有序接收

不保证数据有序

传输效率

相对较低,有连接建立和断开开销

相对较高,无连接开销

首部开销

一般为 20 字节

固定为 8 字节

优点

可靠、有序,适用于文件传输、网页浏览

高效、开销小,适用于实时性要求高的场景

缺点

效率低、资源占用多

不可靠、不保证有序

在选择使用 TCP 还是 UDP 时,需要根据具体的应用场景来决定。例如,对于视频会议、在线游戏等对实时性要求较高的应用,即使可能会有少量数据丢失,也更适合使用 UDP;而对于文件下载、电子邮件等对数据准确性要求较高的应用,则应选择 TCP。

3. 简述浏览器通过 WSGI 请求动态资源的过程

WSGI(Web Server Gateway Interface)是 Python Web 应用程序和 Web 服务器之间的标准接口,它定义了 Web 服务器如何与 Python 应用程序进行通信。浏览器通过 WSGI 请求动态资源的过程涉及多个环节。

python

def simple_app(environ, start_response):"""简单的 WSGI 应用"""status = '200 OK'headers = [('Content-type', 'text/plain; charset=utf-8')]start_response(status, headers)return [b'Hello, World!']if __name__ == '__main__':from wsgiref.simple_server import make_serverhttpd = make_server('localhost', 8000, simple_app)print("Serving on port 8000...")httpd.serve_forever()
  • 要点
  1. 浏览器发起 HTTP 请求。

  2. Web 服务器(如 Apache、Nginx)接收请求。

  3. Web 服务器将请求信息封装成符合 WSGI 规范的环境变量和可调用对象,调用 WSGI 应用程序。

  4. WSGI 应用程序处理请求,可能访问数据库、调用其他服务。

  5. WSGI 应用程序返回响应信息。

  6. Web 服务器将响应信息封装成 HTTP 响应,发送给浏览器。

  7. 浏览器解析渲染页面。

WSGI 使得 Python Web 应用程序可以在不同的 Web 服务器上运行,提高了代码的可移植性。常见的 Python Web 框架如 Flask、Django 都遵循 WSGI 规范。

4. 说明浏览器访问 www.baidu.com 的过程

当用户在浏览器中输入 www.baidu.com 并回车后,浏览器会经历一系列步骤来获取并显示百度的网页。

python

import sockettry:ip = socket.gethostbyname('www.baidu.com')print(f"The IP address of www.baidu.com is {ip}")
except socket.gaierror as e:print(f"DNS resolution error: {e}")
  • 要点
  1. DNS 解析:浏览器先检查本地 DNS 缓存,若没有则向本地 DNS 服务器查询,本地 DNS 服务器若没有则逐级向根 DNS 服务器、顶级域名 DNS 服务器、权威 DNS 服务器查询,最终获取目标网站的 IP 地址。

  2. TCP 连接:使用获取到的 IP 地址和端口号(通常是 80 或 443),通过三次握手与服务器建立 TCP 连接。

  3. HTTP 请求:浏览器向服务器发送 HTTP 请求,包含请求方法、URL、请求头和请求体。

  4. 服务器处理请求:服务器根据请求内容进行处理,可能涉及数据库查询、应用程序调用等。

  5. HTTP 响应:服务器处理完请求后,向浏览器发送 HTTP 响应,包含响应状态码、响应头和响应体。

  6. 浏览器解析渲染页面:浏览器解析响应内容,构建 DOM 树、CSSOM 树,合并成渲染树,进行布局和绘制。

  7. TCP 连接关闭:页面渲染完成后,通过四次挥手关闭 TCP 连接。

在实际过程中,还可能涉及到 HTTPS 协议的加密和解密过程,以及缓存策略的应用,以提高访问速度和性能。

5. 说明Post 和 Get 请求的区别

Post 和 Get 是 HTTP 协议中常用的两种请求方法,它们在参数传递方式、安全性、数据长度限制、缓存和使用场景等方面存在差异。

python

import requests# Get 请求示例
response_get = requests.get('https://www.example.com', params={'key': 'value'})
print(f"Get response status code: {response_get.status_code}")# Post 请求示例
data = {'key': 'value'}
response_post = requests.post('https://www.example.com', data=data)
print(f"Post response status code: {response_post.status_code}")
  • 要点

对比项

Get

Post

参数传递方式

参数附加在 URL 后面

参数放在请求体中

安全性

参数暴露在 URL 中,不安全

参数在请求体中,相对安全

数据长度限制

URL 长度有限制

无数据长度限制

缓存

会被浏览器缓存

一般不会被缓存

使用场景

适用于获取数据

适用于提交数据

在实际开发中,需要根据具体的需求选择合适的请求方法。同时,对于敏感信息的传递,即使使用 Post 请求,也建议采用 HTTPS 协议进行加密传输。

6. 说明cookie 和 session 的区别

Cookie 和 Session 是 Web 开发中用于跟踪用户状态的两种机制,它们在存储位置、安全性、数据大小、有效期和应用场景等方面有所不同。

python

from flask import Flask, request, make_response, sessionapp = Flask(__name__)
app.secret_key = 'your_secret_key'@app.route('/set_cookie')
def set_cookie():resp = make_response('Setting cookie...')resp.set_cookie('username', 'John')return resp@app.route('/get_cookie')
def get_cookie():username = request.cookies.get('username')return f'Cookie username: {username}'@app.route('/set_session')
def set_session():session['user'] = 'John'return 'Setting session...'@app.route('/get_session')
def get_session():user = session.get('user')return f'Session user: {user}'if __name__ == '__main__':app.run(debug=True)
  • 要点

对比项

Cookie

Session

存储位置

客户端浏览器

服务器端

安全性

不安全,可能被分析和欺骗

相对安全,数据在服务器端

数据大小

单个 Cookie 不超过 4K,一个站点最多保存 20 个

无数据大小限制

有效期

可通过 ExpiresMax - Age 控制

默认浏览器关闭失效,可设置延长

应用场景

保存基本信息,如用户名、偏好设置

保存登录状态、购物车信息

在使用 Cookie 和 Session 时,需要注意安全性问题。对于 Cookie,可以设置 HttpOnlySecure 属性来提高安全性;对于 Session,需要对会话 ID 进行加密和管理,防止会话劫持。

7.  HTTP 协议有哪些状态码

HTTP 状态码是服务器返回给客户端的三位数字代码,用于表示请求的结果。常见的状态码可以分为五类。

python

import requestsresponse = requests.get('https://www.example.com')
print(f"Response status code: {response.status_code}")
  • 要点

状态码分类

含义

常见状态码及说明

1xx(信息性状态码)

表示临时响应,用于通知客户端部分请求已被接收

100 Continue:客户端应继续发送请求

2xx(成功状态码)

表示请求成功

200 OK:请求成功;201 Created:资源已创建;204 No Content:请求成功但无返回内容

3xx(重定向状态码)

表示需要进一步操作以完成请求

301 Moved Permanently:资源永久移动;302 Found:资源临时移动;304 Not Modified:资源未修改,可使用缓存

4xx(客户端错误状态码)

表示客户端请求有错误

400 Bad Request:请求语法错误;401 Unauthorized:未授权;403 Forbidden:服务器拒绝执行;404 Not Found:资源不存在

5xx(服务器错误状态码)

表示服务器处理请求时出现错误

500 Internal Server Error:服务器内部错误;502 Bad Gateway:网关或代理接收到无效响应;503 Service Unavailable:服务器临时不可用

在实际开发中,根据不同的状态码可以进行相应的处理。例如,当返回 404 状态码时,可以显示自定义的错误页面;当返回 500 状态码时,需要记录错误日志以便排查问题。

8. 什么是三次握手和四次挥手

三次握手是 TCP 建立连接的过程,确保双方都有发送和接收数据的能力;四次挥手是 TCP 断开连接的过程,确保双方都能正确关闭连接。

python

# 模拟三次握手
def three_way_handshake():print("Client: SYN, seq=x")print("Server: SYN+ACK, seq=y, ack=x+1")print("Client: ACK, ack=y+1")print("Connection established.")# 模拟四次挥手
def four_way_wave():print("Client: FIN, seq=u")print("Server: ACK, ack=u+1")print("Server: FIN, seq=v")print("Client: ACK, ack=v+1")print("Connection closed.")if __name__ == "__main__":print("Three-way handshake:")three_way_handshake()print("\nFour-way wave:")four_way_wave()
  • 要点

三次握手

  1. 客户端发送 SYN 包,请求建立连接。

  2. 服务器发送 SYN+ACK 包,同意建立连接并确认客户端请求。

  3. 客户端发送 ACK 包,确认服务器请求,连接建立。

四次挥手

  1. 客户端发送 FIN 包,请求关闭连接。

  2. 服务器发送 ACK 包,确认客户端关闭请求。

  3. 服务器发送 FIN 包,请求关闭连接。

  4. 客户端发送 ACK 包,确认服务器关闭请求,连接断开。

三次握手和四次挥手是 TCP 协议保证连接可靠性的重要机制。在实际网络环境中,可能会出现丢包、超时等情况,需要通过重传机制来确保连接的正常建立和关闭。

9. 什么是 TCP 的 2MSL

MSL(Maximum Segment Lifetime)是指一个 TCP 分段在网络中最大的生存时间。2MSL 即两倍的 MSL 时间。在 TCP 连接关闭过程中,主动关闭连接的一方在发送最后一个 ACK 包后,会进入 TIME - WAIT 状态并保持 2MSL 时间。

python

# 模拟 TCP 连接关闭进入 TIME - WAIT 状态
def tcp_connection_close():print("Client sends FIN to close connection.")print("Server sends ACK.")print("Server sends FIN.")print("Client sends ACK and enters TIME - WAIT state for 2MSL.")if __name__ == "__main__":tcp_connection_close()
  • 要点
  1. MSL 是 TCP 分段在网络中的最大生存时间。

  2. 2MSL 是主动关闭连接方在 TIME - WAIT 状态的停留时间。

不同的操作系统对 MSL 的定义可能不同,一般来说,MSL 的值在 30 秒到 2 分钟之间。2MSL 时间的设置是为了保证 TCP 连接的可靠



友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90411385

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32的HAL库开发---ADC采集内部温度传感器

一、STM32内部温度传感器简介 二、温度计算方法 F1系列: 从数据手册中可以找到V25和Avg_Slope F4、F7、H7系列只是标准值不同,自行查阅手册 三、实验简要 1、功能描述 通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后&…

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Android 串口通信

引言 在iot项目中,Android 端总会有和硬件通信。 通信这里:串口通信,蓝牙通信或者局域网通信。 这里讲一下串口通信。 什么是串口? “串口”(Serial Port)通常是指一种用于与外部设备进行串行通信的接口。…

跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围

一 查看springboot自带的tomcat版本: 可直接在项目中找到Maven Dependencies中找到tomcat版本 二、查看SpringBoot内置tomcat版本的支持范围 我这边是跟据maven仓库查看的 首先跟据链接打开maven仓库:https://mvnrepository.com/ 然后搜索&#xff1a…

磐维数据库双中心容灾流复制集群搭建

1. 架构 磐维数据库PanWeiDB V2.0.0基于gs_sdr工具,在不借助额外存储介质的情况下实现跨Region的异地容灾。提供流式容灾搭建,容灾升主,计划内主备切换,容灾解除、容灾状态监控等功能。 2. 部署双中心磐维集群 2.1. 主集群 角色…

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…

【机器学习】【KMeans聚类分析实战】用户分群聚类详解——SSE、CH 指数、SC全解析,实战电信客户分群案例

1.引言 在实际数据分析中,聚类算法常用于客户分群、图像分割等场景。如何确定聚类数 k 是聚类分析中的关键问题之一。本文将以“用户分群”为例,展示如何通过 KMeans 聚类,利用 SSE(误差平方和,也称 Inertia&#xff…

20-R 绘图 - 饼图

R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图,语法格式如下: pie(x, l…

搭建 Hadoop 3.3.6 伪分布式

搭建 Hadoop 3.3.6 伪分布式 IP 192.168.157.132 初始化操作 更改yum源 # 1_1.安装Wget yum install wget# 1_2.备份CentOS-Base.repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak# 2.下载阿里yum源配置 wget -O /etc/yum.repos.d/Cen…

python电影数据分析及可视化系统建设

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

手机壁纸设计中,金属质感字体可以为壁纸增添独特的视觉效果和高端感

在手机壁纸设计中,金属质感字体可以为壁纸增添独特的视觉效果和高端感。以下是一些关于金属质感字体在手机壁纸设计中的应用建议和案例分析: 1. 金属质感字体的特点 视觉冲击力强:金属质感字体具有独特的光泽和质感,能够在视觉上…

使用ezuikit-js封装一个对接摄像头的组件

ezuikit-js 是一个基于 JavaScript 的视频播放库,主要用于在网页中嵌入实时视频流播放功能。它通常用于与支持 RTSP、RTMP、HLS 等协议的摄像头或视频流服务器进行交互,提供流畅的视频播放体验。 主要功能 多协议支持:支持 RTSP、RTMP、HLS …

PHP post 数据丢失问题

max_input_vars是PHP配置选项之一,用于设置一个请求中允许的最大输入变量数。它指定了在处理POST请求或者通过URL传递的参数时,PHP脚本能够接收和处理的最大变量数量。 max_input_vars的默认值是1000,意味着一个请求中最多可以包含1000个输入…

jenkins docker容器中安装python3.9环境

在运维过程中,不过避免的需要使用到python,在jenkins 的docker容器中,是没有python环境的,需要我们自己手动安装一下。 查看是否有工具apt-get 直接输入apt-get 然后回车,出现以下内容,表示支持apt-get命令…

《Spring实战》(第6版) 保护Spring

第1部分 Spring基础 第4章 使用非关系型数据 关系型数据库一直是首选,近年来"NoSQL"数据库提供了数据存储的不同概念和结构。 SpringData为很多NoSQL数据库提供了支持,包括MongoDB、Cassandra、Couchbase、Neo4j、Redis等,无论选…

SQLMesh 系列教程7- 详解 seed 模型

SQLMesh 是一个强大的数据建模和管道管理工具,允许用户通过 SQL 语句定义数据模型并进行版本控制。Seed 模型是 SQLMesh 中的一种特殊模型,主要用于初始化和填充基础数据集。它通常包含静态数据,如参考数据和配置数据,旨在为后续的…

【JavaEE】-- 多线程(初阶)2

文章目录 3.线程的状态3.1观察线程的所有状态3.2线程状态和状态转移的意义 4.多线程带来的的风险-线程安全 (重点)4.1观察线程不安全4.2 线程不安全的原因4.2.1 线程调度是随机的4.2.2 修改共享数据4.2.3 原子性4.2.4 内存可见性4.2.5 指令重排序 4.3解决之前的线程不安全问题 …

安卓系统远程控制电脑方法,手机远控教程,ToDesk工具

不知道大家有没有觉得手机、平板虽然很好用,却也仍存在有很多替代不了电脑的地方。就比如说撰写文档、做数据报表啥的就不如PC端操作般方便,就跟别说PS修图、AE视频剪辑等需高性能设备来带动才易用的了。 好在也是有对策可解决,装个ToDesk远程…

机器学习(李宏毅)——RL(强化学习)

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 二、大纲 What is RL?Three steps in MLPolicy GradientActor-CriticReward Shaping 三、What …

【Go】Go wire 依赖注入

1. wire 简介 wire 是一个 Golang 的依赖注入框架(类比 Spring 框架提供的依赖注入功能) ⭐ 官方文档:https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则:A用到了B,那么B一定是通过依赖注入的…