弟12章 网络编程
文章目录
- 网络协议概述 p164
- TCP协议与UDP协议的区别 p165
- TCP服务器端代码的编写 p166
- TCP服务器端流程
- TCP客户端代码的编写 p167
- TCP客户端流程
- 主机和客户端的通信流程
- tcp多次通信服务器端代码 p168
- TCP多次通信客户端代码 p169
- UDP的一次双向通信 p170
- udp通信模型
- udp接收方代码
- udp发送方的代码
- 模拟客服咨询小程序 p171
- 客服代码
- 客户代码
- 本章总结及习题 p172
- windows系统查看端口号对应的进程pid
网络协议概述 p164
ipv4:十进制点分制
ipv6:十六进制冒号分隔
TCP协议与UDP协议的区别 p165
tcp协议的三次握手:
udp协议:又称为用户数据包协议(User Datagram Protocol),它是面向无连接的协议,只要知道对方的ip地址和端口,就可以直接发送数据包,由于是面向无连接的,所以无法保证数据一定会到达接收方
tcp比喻成打电话,udp比喻成发短信
tcp和udp都是传输层的协议
什么是端口号?
区分计算机中的运行的应用程序的整数
端口号的取值范围是0到65535,一共65536个,其中80这个端口号分配给HTTP服务,21这个端口号分配给了FTP服务,1433是分给了SQL server数据库
TCP和UDP的区别
TCP协议 | UDP协议 | |
---|---|---|
连接方面 | 面向连接的 | 面向无连接 |
安全方面 | 传输可靠不丢失,不丢失,按顺序到达 | 无法保证不丢包 |
传输效率方面 | 传输效率相对较低 | 传输效率高 |
连接对象数量方面 | 只能点对点 一对一 | 支持一对一,一对多,多对多的交互通信 |
socket简介
描述ip地址和端口号
socket对象的常用方法
方法名称 | 功能描述 |
---|---|
bind((ip,port)) | 绑定ip地址和端口 |
listen(N) | 开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5 |
accept() | 被动接收TCP客户端连接,阻塞式,返回一个元组,分别是客户端socket和客户端地址 |
connect((ip,port)) | 主动初始化TCP服务器连接 |
recv(size) | 接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量 |
send(str) | 发送tcp数据,返回值是要发送的字节数量 |
sendall(str) | 完整发送tcp数据,将str中的数据发送到连接的套接字,返回之前尝试发送所有数据,若成功为None,失败抛出异常 |
recvfrom() | 接收udp数据,返回值是一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址 |
sendto(data,(ip,port)) | 发送udp数据,返回值是发送的字节数 |
close() | 关闭套接字 |
TCP服务器端代码的编写 p166
TCP服务器端流程
1、使用socket类创建一个套接字对象
2、使用bind((ip,port))
方法绑定ip地址和端口号
3、使用listen()
方法开始TCP监听
4、使用accept()
方法等待客户端的连接
5、使用recv() / send()
方法接收和发送数据
6、使用close()
关闭套接字
代码示例:
from socket import socket,AF_INET,SOCK_STREAM
# AF_INET用于internet之间的进程通信
# SOCK_STREAM表示TCP协议# 1、创建socket模块
server_socket=socket(AF_INET,SOCK_STREAM)
# print(type(server_socket)) # <class 'socket.socket'># 2、绑定ip地址和端口
ip='127.0.0.1' # 表示连接本机
port=8888 # 不要和已有的指定端口冲突,比如sql服务的port是3306
server_socket.bind((ip,port)) # bind参数是一个元组# 3、使用listen()开始监听
server_socket.listen(5)
print('服务器已启动(客户端连接成功后,服务器的代码才会向下执行)')# 4、等待客户端的连接
client_socket,client_addr=server_socket.accept() # accept方法返回一个元组类型,通过系列解包赋值分别赋值给左边
print(type(client_socket))
print(type(client_addr))# 5、接收来自客户端的数据
data=client_socket.recv(1024) # 返回值是一个字符串类型,最大值为1024
print('客户端发送过来的数据为:',data.decode('UTF-8'))# 6、关闭socket
server_socket.close()
TCP客户端代码的编写 p167
TCP客户端流程
1、使用socket类创建一个套接字对象
2、使用connect((host,port))
设置连接的主机ip和主机设置的端口
3、使用 recv() / send()
方法接收/发送数据
4、使用close()
关闭套接字
本电脑上已经有一个project在运行服务器端代码。
此时需要新建一个项目代表另一台电脑,去跑客户端代码。
右上角 FIle ,然后 new project
然后设置新project的路径
然后选择新窗口打开,从而运行了两个Pycharm
代码示例:
import socket# 1、创建socket对象
client_socket=socket.socket() # 服务器端要加参数,客户端不需要# 2、通过ip和port连接服务器
ip='127.0.0.1'
port=8888
client_socket.connect((ip,port))
print('客户端和服务器端的连接建立成功')# 3、发送数据
client_socket.send('welcome to Python world'.encode('UTF-8'))
# client_socket.send('welcome to Python world') 不能直接发送发送字符串 TypeError: a bytes-like object is required, not 'str'
# 4、关闭
client_socket.close()
print('发送成功')
主机和客户端的通信流程
tcp多次通信服务器端代码 p168
import socket # 这么写的话就要写socket模块名 from...import不需要写模块名# 1、创建socket对象
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2、绑定主机ip和port
server_socket.bind(('127.0.0.1',8888))# 3、开始监听 最大监听数量设置为5
server_socket.listen(5)# 4、开始等待客户端的tcp连接
client_socket,cliet_addr=server_socket.accept()# 5、接收数据
info=client_socket.recv(1024).decode('UTF-8') # 服务器端接收数据时要从client端socket去接
while info!='bye':if info:print('接收到的数据为:',info)# 准备回复的数据data=input('请输入要回复的数据:')client_socket.send(data.encode('UTF-8')) # 发数据也是从client端去发if data=='bye':breakinfo = client_socket.recv(1024).decode('UTF-8')# 关闭两个socket对象
client_socket.close()
server_socket.close()
TCP多次通信客户端代码 p169
import socket# 1、创建socket对象
client_socket=socket.socket() # 客户端这边不需要加参数:AF_INET,SOCK_STREAM这些参数,只有服务器端要加# 2、连接主机的ip和port
ip='127.0.0.1'
port=8888
client_socket.connect((ip,port)) # 注意参数是个元组
print('与服务器端建立连接')# 3、客户端先发送数据
info=''
while info!='bye':send_data=input('请输入客户端要发送的数据:')client_socket.send(send_data.encode('UTF-8'))if send_data=='bye':print('客户端发起结束')breakinfo=client_socket.recv(1024).decode('UTF-8')print('收到服务器的响应数据:',info)client_socket.close()
UDP的一次双向通信 p170
udp协议是面向无连接的,只要知道对方的ip和端口号就可以发送数据包,但是不保证数据包能一定送达
udp通信模型
udp接收方代码
# udp接收方的代码
import socket# 1、创建socket对象
recv_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 2、绑定ip地址和端口
recv_socket.bind(('127.0.0.1',8888))# 3、接收来自发送方的数据
recv_data,addr=recv_socket.recvfrom(1024) # 注意返回对象是一个元组,系列解包赋值
print('-'*66)
print('接收到的数据为:',recv_data.decode('UTF-8'))
print('接收数据来自:',addr) # 接收数据来自: ('127.0.0.1', 59661)
print('-'*66)# 4、准备回复对方的数据
data=input('请输入要回复的数据:')# 5、回复
recv_socket.sendto(data.encode('UTF-8'),addr)# 6、关闭
recv_socket.close()
udp发送方的代码
# UDP发送方的代码
import socket
'''
AF_INET 表示网络间通信SOCK_STREAM 表示TCP
SOCK_DGRAM 表示UDP
'''# 1、创建socket对象
send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 2、准备发送数据
data=input('请输入要发送的数据:')# 3、指定接收方的ip和port
ip_port=('127.0.0.1',8888)# 4、发送数据
send_socket.sendto(data.encode('UTF-8'),ip_port)# 5、接收来自接收方的数据
recv_data,addr=send_socket.recvfrom(1024) # 注意recvfrom返回的是一个元组,使用解包赋值
print('-'*66)
print('接收到的数据为:',recv_data.decode('UTF=8'))
print('接收数据的地址为:',addr)
print('-'*66)# 6、关闭socket对象
send_socket.close()
模拟客服咨询小程序 p171
模拟udp编程
客服代码
# 客服人员
import socketrecv_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)recv_socket.bind(('127.0.0.1',8888)) # 注意入参是一个元组while True:recv_data,addr=recv_socket.recvfrom(1024) #返回值是一个元组类型,系列解包赋值recv_string=recv_data.decode('UTF-8')print('客户说:',recv_string)print('客户地址:',addr)if recv_string=='bye':print('服务器端即将推出')break# 服务器端回复客户端数据data=input('回复什么给客户端:')recv_socket.sendto(data.encode('UTF-8'),addr) # 注意udp发送数据接口为sendto,参数2为addrrecv_socket.close()
客户代码
# 客户咨询者
import socketsend_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议收发数据都要加参数 tcp协议收发数据只有服务器端代码要加参数while True:data=input('客户说:')send_socket.sendto(data.encode('UTF-8'),('127.0.0.1',8888))if data=='bye':print('客户端发起结束')breakrecv_data,addr=send_socket.recvfrom(1024)print('客户端接收数据:',recv_data.decode('UTF-8'))print('服务器端地址:',addr)send_socket.close()
本章总结及习题 p172
网上聊天软件一般是udp
QQ采用的通信协议以UDP为主,辅以TCP协议。
windows系统查看端口号对应的进程pid
看这个
相关文章:

弟12章 网络编程
文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u…...

【sklearn练习】模型评估
一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况: from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…...

Gazebo的模型下载。
git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git,并完成路径配置。 (本文提供了gitee下载,国外的Github下载较慢。)...
MyBatis - DAO 接口(Mapper.xml)支持方法重载吗?
方法重载(Method Overloading)是指在同一个类中定义多个方法,它们具有相同的方法名但参数列表不同。 Dao 在 MyBatis 的 DAO 层接口中,是允许方法重载的。 在 DAO 层接口中,可以根据不同的需求和条件定义多个方法&am…...

SAP PI之Rest adapter
一,简介 REST风格接口是以http为传输协议,以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程,一个REST接口包含的信息有:服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…...

推荐几个Github高星GoLang管理系统
在Web开发领域,Go语言(Golang)以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统,这些项目星星众多,提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…...

生成式对抗网络GAN
Generative Adversarial Nets由伊恩古德费洛(Ian J.Goodfellow)等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…...

Python如何使用Excel文件
使用Python操作Office——EXCEL 首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个EXCEL文档,就可以在里面编辑VB脚本,实现我们自己的效果。对于这种一本万利的买卖,Python怎么能放过…...
前端基础:回顾es6相关知识
Author note(题记): ECMAscript is international standard of javascript。 ECMA 是 js的国际标准版语言。 let and const 为什么之前用var现在需要用let,const呢? 其实就是因为规范作用域的问题。var的作用域无块级 for (var i 0; i <…...
Hive条件函数详细讲解
Hive 中的条件函数允许你在查询中基于某些条件执行逻辑操作。以下是你提到的条件函数的详细讲解,包括案例和使用注意事项: IF() 功能:根据条件返回两个表达式中的一个。语法:IF(boolean_test, value_if_true, value_if_false)案例:SELECT IF(1=1, true, false); 结果为 tr…...

java应用CPU过高查找原因
用top查到占用cpu最高的进程pid 根据进程ID找到占用CPU高的线程 ps -mp 60355 -o THREAD,tid | sort -r 用 printf "%x \n" 将tid换为十六进制:xid printf "%x \n" 6036 根据16进制格式的线程ID查找线程堆栈信息 jstack 60355 |grep ebcb -A…...

RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?
在RxJS(Reactive Extensions for JavaScript)中,Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体,它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别: 1、Subject: 是一种特…...
【算法题】55. 跳跃游戏
题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1ÿ…...

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?
随着全球工业化进程的加快,工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染,工业企业在能源管理方面迫切需要一套规…...

LLM:Training Compute-Optimal Large Language Models
论文:https://arxiv.org/pdf/2203.15556.pdf 发表:2022 前文回顾: OpenAI在2020年提出《Scaling Laws for Neural Language Models》:Scaling Laws(缩放法则)也一直影响了后续大模型的训练。其给出的结论是最佳计算效…...

http跟https有什么区别?
HTTP(Hypertext Transfer Protocol)和HTTPS(HTTP Secure)是两种不同的通信协议,它们在数据传输的安全性方面有明显的区别: 1. 安全性: - HTTP:是一种明文传输协议,数…...

python flask学生管理系统
预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…...

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?
环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …...

基于位的权限系统
基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中,不同的权限被编码为2的幂次方 (例如1、2、4、8等),每个权限对应一个独立的二进制位(可想而知运算速度是非常快的)。通过将这些权限值组合在一起形成一个…...
[AIGC] Spring Boot Docker 部署指南
Spring Boot Docker 部署指南 引言 近年来,容器化部署成为了越来越流行的部署方式。Docker 是目前最受欢迎的容器化平台之一,它提供了一种将应用程序与其依赖项打包在一起,并以容器的形式运行的方法。Spring Boot 是一种用于快速开发和微服…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...