弟12章 网络编程

news2024/11/18 8:35:24

文章目录

    • 网络协议概述 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':
        break

    info = 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('客户端发起结束')
        break

    info=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 socket

recv_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为addr


recv_socket.close()

客户代码

# 客户咨询者
import socket

send_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('客户端发起结束')
        break

    recv_data,addr=send_socket.recvfrom(1024)
    print('客户端接收数据:',recv_data.decode('UTF-8'))
    print('服务器端地址:',addr)

send_socket.close()

本章总结及习题 p172

网上聊天软件一般是udp

QQ采用的通信协议以UDP为主,辅以TCP协议。

windows系统查看端口号对应的进程pid

看这个

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

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

相关文章

6 - 常用工具类

目录 1. Scanner 扫描控制台输入 1.1 扫描控制台输入 1&#xff09;nextLine 2&#xff09;nextInt 3&#xff09;其他方法 1.2 扫描文件 1.3 查找匹配项 2. Arrays 数组工具 2.1 创建数组 1&#xff09;copyOf 2&#xff09;copyOfRange 3&#xff09;fill 2.2 比…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

.NET国产化改造探索(三)、银河麒麟安装.NET 8环境

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 上一篇介绍了如何在银河麒麟操作系统上安装人大金仓数据库&#xff0c;这篇文章详细介绍下在银河麒麟操作系统上安装.NET8环境。…

Spring基础属性一览:注释、对象装配、作用域、生命周期

在Spring中想要更简单的存储和读取对象的核心是使用注解&#xff0c;也就是我们接下来要学的Spring中相关注解。 之前我们存储Bean时&#xff0c;需要在自己添加的配置文件中添加一行bean才行&#xff1a; 而现在我们只需要一个注解就可以替代之前要写的一行配置的繁琐了。 …

避免C#WindowForm编写的程序重复打开--问题解决

目录&#xff1a; 一&#xff0c;问题描述二&#xff0c;问题解决 一&#xff0c;问题描述 ❄️当你经常使用程序或者开发程序的时候&#xff0c;可能经常都会遇到一个问题&#xff1a;就是程序exe文件当多次点击后&#xff0c;无论是否及时加载&#xff0c;都会产生原本程序的…

Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署

文章目录 Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署分布式引擎Elasticsearch_8.11.4安装及本地部署系统环境要求1 Windows 安装 Elasticsearch下载完成后进行解压,进入 bin 目录,找到elasticsearch.bat脚本文件执行一键启动.启动都选允…

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)。 技术架构是对某一技术问题(需求)解决方案的结构化描述,由构成解决方案的组件结构及之间的交互关系构成。广义上的技术架构是一系列涵盖多类技术问题设计方案的统称,例如部署方案、存储方案、缓存…

Java重修第六天—面向对象3

通过学习本篇文章可以掌握如下知识 1、多态&#xff1b; 2、抽象类&#xff1b; 3、接口。 之前已经学过了继承&#xff0c;static等基础知识&#xff0c;这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象&#xf…

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

51单片机HC-SR04超声波测距lcd1602显示(程序+ad硬件设计+文档说明)

本帖主控使用STC89C52单片机&#xff0c;超声波测距采用HC-SR04模块&#xff0c;包含ad硬件设计和文档。 测距原理 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测出发射和接收回波的时间差t,然后求出距SCt/2,式中的C为超声波波速。由于超声…

Xmind 网页端登录及多端同步

好久没用 Xmind 了&#xff0c;前几天登录网页端突然发现没办法登录了&#xff0c;总是跳转到 Xmind AI 页面。本以为他们不再支持网页端了&#xff0c;后来看提示才知道只是迁移到了新的网址&#xff0c;由原来的 xmind.works 现在改成了的 xmind.ai。又花费好长时间才重新登录…

openEuler安装Docker艰辛路程

文章目录 安装docker测试docker关于windows docker拉取镜像查看所有镜像删除镜像删除不在运行的进程强制删除正在运行的进程 启动docker容器服务-d测试 停止docker容器服务查看docker启动进程更新容器(没有自启动功能&#xff0c;更新为自启动)docker端口映射进入容器修改内容退…

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf 症状 Visual Studio调试模式下&#xff0c;程序停在断点时&#xff0c;我临时需要将ppt转为pdf&#xff0c;遂右键单击文件&#xff0c;想直接转pdf&#xff0c;奈何光标转了几秒钟&#xff0c;毫无反应。 解决方法 …

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

快速知识付费平台搭建,一分钟搭建你的专属知识服务平台

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化 …

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

电子招投标全程在线应用安全

电子招投标全程在线应用安全解决方案 电子招投标全程在线应用是指招标人、招标代理机构、投标人、评标专家、监管机构利用公共互联网开展的招标、投标、开标、评标、定标、监管的活动过程。 由于该过程全程在线运行在风险因素较多的公共互联网上&#xff0c;存在电子招投标中…

python爬虫-代理ip理解

目录 1、为什么使用代理IP 2、代理IP 3、IP池 4、代理分类&#xff1a; 5、python中使用代理IP 6、如何找可以使用的代理IP 7、拿到IP后&#xff0c;测试IP的有效性 8、扩展理解正向代理和反向代理 1、为什么使用代理IP 就是为了防止ip被封禁&#xff0c;提高爬虫的效…

隧道应用4-内网穿透EW的简单使用

与netsh端口映射内网类似&#xff0c;也是通过跳板机实现 EW官网地址&#xff1a;http://rootkiter.com/EarthWorm EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 注&#xff1a; 考虑…

sshpass 命令exit code 6 问题解决方法

近期在使用sshpass做自动化交互的脚本&#xff0c;结果运行命令后会返回错误码6,命令如下&#xff1a; sshpass -p 123456 ssh test192.168.1.100 "uname -a" 经搜索资料发现&#xff0c;错误码6指的是Host public key is unknown&#xff0c;也就是说要访问的地址是…