弟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':
        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.mfbz.cn/a/327865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】ipoib驱动 - ipoib_cm_handle_rx_wc_rss

一、ipoib_cm_handle_rx_wc_rss函数定义 void ipoib_cm_handle_rx_wc_rss(struct net_device *dev, struct ib_wc *wc) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_cm_rx_buf *rx_ring;unsigned int wr_id wc->wr_id & ~(IPOIB_OP_CM | IPOIB_OP_RE…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知&#xff0c;在Spring Boot框架中&#xff0c;Controller层API接口编码获取请求体参数时&#xff0c;在参数上会使用RequestBody注解&#xff1b;如果一次请求中&#xff0c;请求体参数携带的内容需要用多个参数接收时&#xff0c;能不能多次使用RequestBody…

通过OpenIddict设计一个授权服务器02-创建asp.net项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…

智能时代,让AI为你撰写专业应用文

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 何谓应用文&#xff1f;简单来说&#xff0c;应用文是指在日常生活中以及工作中撰写的&#xff0c;旨在传递信息、处理事务的一种文体类型。其范畴广泛&#xff0c;涵盖了诸如请假条、通知书、辞职信、检查报告、欠条、…

【控制篇 / 分流】(7.4) ❀ 01. 对指定IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带&#xff0c;一条ADSL拨号用来上网&#xff0c;一条移动SDWAN&#xff0c;已经连通总部内网服务器&#xff0c;领导要求&#xff0c;只有访问公司服务器IP时走移动SDWAN&#xff0c;其它访问都走ADSL拨号&#xff0c;如果你是管理员&#xff0c;你知道有…

vuex前端开发,getters是什么?怎么调用?简单的案例操作

vuex前端开发,getters是什么&#xff1f;怎么调用&#xff1f;简单的案例操作&#xff01; 下面通过一些简单的案例&#xff0c;来了解一下&#xff0c;vuex当中的getters到底是什么意思&#xff0c;有哪些实际的操作案例。 Vuex的getters主要用于对store中的state进行计算或过…

LNMP环境下综合部署动态网站

目录 LNMP部署--nginx 搭建mysql数据库 安装mysql的过程&#xff1a; 部署PHP&#xff1a; ​编辑​编辑php的配置文件在哪 wordpress程序安装 LNMP部署--nginx 纯净--联网状态 环境变量中没有nginx 安装形式的选择&#xff1a; yum安装&#xff1a;自动下载安装包及…

2024年美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

Qt/QML编程之路:slider(34)

滑条slider&#xff0c;有时也成为进度条progressbar&#xff0c;在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…

网络安全中的“三高一弱”和“两高一弱”是什么?

大家在一些网络安全检查中&#xff0c;可能经常会遇到“三高一弱”这个说法。那么&#xff0c;三高一弱指的是什么呢&#xff1f; 三高&#xff1a;高危漏洞、高危端口、高风险外连 一弱&#xff1a;弱口令 一共是4个网络安全风险&#xff0c;其中的“高危漏洞、高危端口、弱…

力扣精选算法100题——等于目标值的两个数or三数之和(双指针专题)

目录 &#x1f6a9;等于目标值的俩个数 第一步&#xff1a;了解题意 第二步&#xff1a;算法原理 第三步&#xff1a;代码实现 &#x1f6a9;三数之和 第一步&#xff1a;了解题意 第二步&#xff1a;算法原理 思路&#xff1a; ❗不漏&#xff1a; ❗去重: &#xf…

2. goLand安装及外配置参数通用用法

目录 概述测试代码解决外配置参数结束 概述 选择版本安装 go 安装的版本 1.go安装及相关配置 goLand 对于 习惯 idea 系列使用的人&#xff0c;还是很友好的。 测试代码 package mainimport ("flag""fmt""os" )func main() {name : flag.St…

C++核心编程(包含:内存、函数、引用、类与对象、文件操作等)【持续更新】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 C核心编程&#x1f30f;1 内存分区模型&#x1f384;1.1 程序运行前&#x1f384;1.2 程序运行后&#x1f384;1.3 new操作符 &#x1f30f;2 引用&#x1f384;2.1 引用的基…

使用composer生成的DMG和PKG格式软件包有何区别

在使用Composer从包源构建软件包时候&#xff0c;有两种不同类型的包&#xff1a;PKG和DMG。你知道两者之间的区别吗? 以及如何选取吗&#xff1f; 每种格式都有各自的优势具体取决于软件包的预期用途以及用于部署软件包的工具。下面我们来了解一下PKG和DMG格式的区别和用途。…

C++I/O流——(4)格式化输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

如何快速看懂一篇英文AI论文?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

使用micro-app将现有项目改造成微前端,对现有项目实现增量升级

使用micro-app将现有项目改造成微前端&#xff0c;对现有项目实现增量升级 基座应用 1、安装依赖 npm i micro-zoe/micro-app --save2、在入口引入 //main.js import microApp from micro-zoe/micro-appnew Vue({ }) //在new Vue 下面执行 microApp.start()3、新增一个vue页…

harbor https

harbor https部署 准备docker-compose安装https 证书harbor安装访问harbor推镜像到harbor 准备 192.168.112.99&#xff0c;harbor&#xff0c;centos7 192.168.112.3&#xff0c;测试机&#xff0c;centos7 docker版本&#xff1a;docker-ce 20.10.16&#xff08;部署参考&a…

imgaug库指南(28):从入门到精通的【图像增强】之旅(万字长文)

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

在Excel中如何打开VBA,这里提供两种方法

想在Excel中创建或添加自己的自定义Visual Basic脚本吗&#xff1f;第一步是了解如何在Excel中打开VBA编辑器。 在易用性和整体功能方面&#xff0c;没有其他电子表格应用程序能与Excel相提并论。无论你想做什么&#xff0c;只要你能深入挖掘Excel的深层菜单&#xff0c;就有很…