Python学习----网络编程

news2024/11/15 12:21:46

网络:网络就是实现资源共享和信息传递的虚拟平台,我们可以编写基于网络通信的程序。比如socket编程,web开发

Socket编程

Socket是程序之间通信的一个工具,好比显示生活中的电话,你知道了对方的电话号码之后,需要使用电话进行通讯。同理你知道了对方的ip 地址和端口号之后,你需要使用socket进行通信。

在通信之前,我们需要选择网络通讯协议(网络传输方式)。保证程序之间按照指定的规则进行数据通信。

TCP

TCP 简称 传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
1、面向连接:通信双方必须先建立好连接才能进行数据传输,并且双方都会为此连接分配必要资源用来记录连接的状态和信息。当数据传输完成之后,双方必须断开此连接,以释放系统资源。
2、可靠传输:

TCP采用发送应答机制:
	通过TCP这种方式发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段发送成功
超时重传
	发送端发送一个报文之后就会启动定时器,如果指定的时间内没有得到应答就会重新发送这个报文
错误校验
	TCP用一个 校验和 函数来校验数据是否有错误,在发送和接收时都要计算 校验和
流量控制和阻塞管理
	流量控制用来避免发送端发送过快而使得接收方来不及接收

通信步骤:
1、创建连接
2、传输数据
3、关闭连接

python编码转换

在网络中传输的数据都是二进制的数据,所以我们在发送数据的时候需要将数据转换为二进制,到达目的地之后再将二进制数据转换回来。
转码: encode
解码: decode

TCP客户端程序开发

开发流程:
在这里插入图片描述

开发步骤:
1、导入socket模块
import socket
2、创建客户端socket对象
socket.socket(AddressFamily , Type)
AddressFamily:IP地址类型,分为Ipv4和Ipv6
type:传输协议类型
3、建立连接
connect
4、数据传输
send:发送数据
recv:接收数据
close:关闭连接
代码演示:

import socket

if __name__ == '__main__':
    # 1、创建客户端套接字对象
    # 静态常量  AF_INET代表Ipv4  SOCK_STREAM代表TCP协议
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、和服务器建立套接字连接。参数是元组,指定ip和端口
    tcp_client_socket.connect(("127.0.0.1", 8888))
    # 3、发送数据,需要进行编码
    tcp_client_socket.send("hello".encode(encoding="utf-8"))
    # 4、接收数据,每次接收数据的大小,单位是字节,recv会阻塞等待数据到来,如果你不需要接收数据,那就跳过这步
    recv_data = tcp_client_socket.recv(1024)
    print(recv_data.decode())  # 默认utf-8解码,可省略不写
    # 5、关闭客户端套接字
    tcp_client_socket.close()

TCP服务端程序开发

1、创建服务端套接字对象
2、绑定IP地址和端口号,通过bind()函数完成
3、设置监听 , listen()函数
4、等待接收客户端连接请求
5、接收数据
6、发送数据
7、关闭套接字

开发步骤:
1、导入socket模块
import socket
2、创建服务端socket对象
socket.socket(AddressFamily , Type)
AddressFamily:IP地址类型,分为Ipv4和Ipv6
type:传输协议类型
3、绑定ip地址和端口
bind
4、设置监听
listen
5、等待接收客户端的连接请求
accept
发送数据
6、数据传输
send:发送数据
recv:接收数据
close:关闭连接

代码演示:

import socket

if __name__ == '__main__':
    # 1、创建服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


    # 设置端口复用,关闭程序之后,电脑端口释放需要时间,但是实际上是已经释放了,
    # 但程序认为没有释放,所以关闭程序之后立即启动会报错
    # 直接进行强制复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 2、绑定ip地址和端口号
    # tcp_server_socket.bind(("192.168.31.59", 8888))
    tcp_server_socket.bind(("", 8888))  # 不设置的话,会自动填充本机ip地址
    # 3、设置监听
    tcp_server_socket.listen(128)  # 参数128:代表服务端等待排队连接的最大数量,超出的限制的连接就丢弃
    # 4、等待客户端请求
    # 这步会阻塞等待,如果接收到请求,返回一个用以和客户端通讯的socket,和客户端地址
    # 上面创建的socket只是监听,不会发送数据
    connect_socket, ip_port = tcp_server_socket.accept()
    print("客户端地址:", ip_port)
    # 5、接收数据
    recv_data = connect_socket.recv(1024)
    print("接收到的数据:", recv_data.decode())
    # 6、发送数据
    connect_socket.send("客户端数据已收到".encode())
    # 7、关闭套接字
    connect_socket.close()
    tcp_server_socket.close()

socket的发送和接收缓冲区

当创建一个TCP socket对象的时候,会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区就是内存中的一片空间。

当你要发送消息时,先将消息存放在缓冲区,当消息达到一定的数量之后再一次性进行发送。

send原理解析:
问题:send是不是直接把数据发送给服务端?
不是,要想发送数据,必须得通过网卡发送数据,应用程序无法直接通过网卡发送数据,它需要调用操作系统接口,也就是说,应用程序把发送得数据先写入到发送缓冲区(内存一片空间),再由操作系统控制网卡把发送缓冲区得数据发送给服务端网卡。

recv原理解析:
问题:recv是不是直接从客户端接收数据?
不是,应用程序无法直接通过网卡接收数据,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收得数据写入接收缓冲区(内存一片空间),应用程序再从接收缓冲区获取客户端发送得数据。

在这里插入图片描述

Demo多任务版TCP服务端程序

import socket
import threading


def tcp_server_thread(connect_socket, ip_port):
    print("客户端地址:", ip_port)
    # 5、接收数据
    recv_data = connect_socket.recv(1024)
    print("接收到的数据:", recv_data.decode())
    # 6、发送数据
    connect_socket.send("客户端数据已收到".encode())
    # 7、关闭套接字
    connect_socket.close()


if __name__ == '__main__':
    # 1、创建服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 设置端口复用,关闭程序之后,电脑端口释放需要时间,但是实际上是已经释放了,但程序认为没有释放,所以关闭程序之后立即启动会报错
    # 直接进行强制复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 2、绑定ip地址和端口号
    # tcp_server_socket.bind(("192.168.31.59", 8888))
    tcp_server_socket.bind(("", 8888))  # 不设置的话,会自动填充本机ip地址
    # 3、设置监听
    tcp_server_socket.listen(128)  # 参数128:代表服务端等待排队连接的最大数量,超出的限制的连接就丢弃
    while True:
        # 4、等待客户端请求
        # 这步会阻塞等待,如果接收到请求,返回一个用以和客户端通讯的socket,和客户端地址
        # 上面创建的socket只是监听,不会发送数据
        connect_socket, ip_port = tcp_server_socket.accept()
        server_thread = threading.Thread(target=tcp_server_thread, args=(connect_socket, ip_port))
        server_thread.start()
    tcp_server_socket.close()

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

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

相关文章

RabbitMQ进阶

可以结合着狂神的RabbitMQ的笔记来进行学习 狂神说RabbitMQ笔记 RabbitMQ高级特性 消息可靠性投递 保证我发出的消息可以到达中间件,避免在传输的过程中发生丢失的情况。 这两个可靠性传输方式分别是负责不同的阶段,confirm是负责保证从生产者到队列…

[附源码]Python计算机毕业设计Django抗疫医疗用品销售平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

2023年江苏省职业院校技能大赛中职赛项规程样题

2023年江苏省职业院校技能大赛中职赛项规程 一、赛项名称 赛项编号:JSZ202335 赛项名称:网络安全 赛项组别:学生组、教师组 赛项归属专业大类:信息技术类 竞赛目的 贯彻落实《国家职业教育改革实施方案》《关于推动现代职业教…

设计模式——观察者模式

动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖…

非零基础自学Golang 2 开发环境 2.1 Go 的安装

非零基础自学Golang 学习文档地址:https://www.topgoer.cn/ 本文仅用于学习记录,不存在任何商业用途,如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.1 Go 的安装2.1.1 下载地址2.1.2 Go 的安装2.1.3 安装检查2 开发环境…

TypeScript22(Rollup构建TS项目 webpack构建TS项目)

Rollup构建TS项目 安装依赖: 1.全局安装rollup: npm install rollup-g 2.安装TypeScript: npm install typescript -D 3.安装TypeScript 转换器: npm install rollup-plugin-typescript2 -D 4.安装代码压缩插件&#xff1a…

项目:金融行业反欺诈模型

当今以互联网、移动终端等为代表的技术力量正深刻地影响着金融支付市场,信息化、网络化、无线终端等技术的应用,使金融机构特别是银行业的经营发生了天翻地覆的变化,传统的银行柜台和网点业务,正渐渐被电子化交易所替代&#xff0…

[附源码]计算机毕业设计基于SpringBoot的黄河文化科普网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Golang开发变量声明命名惯例

《Go语言精进之路》第二、三章部分内容学习记录笔记。 1.基本原则 Golang开发中,可遵守简单且一致的命名原则,力求命名精简、易懂和一致。 package声明 Golang的package声明以小写形式的单个词进行命名: shopservice、utils、logs、tcc、l…

08_openstack之nova节点扩容

目录 一、环境准备 二、扩容节点配置 三、部署扩容节点 1、编辑answer.ini文件 2、执行安装 一、环境准备 部署openstack私有云环境:02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 上述环境只部署了nova1节点,现将未部署的nova2节点作为扩…

1. Nginx 基本功能配置

Nginx 目录信息 图 为 windows 版本的。 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp 其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件 client_body_t…

20221104英语学习

今日单词: portable adj.轻便的,便携的;手提式的 beautiful adj.美丽的, 风和日丽的, 出色的 hunter n.猎人, 狩猎者, (猎食其他动物的)猎兽, 搜集某种东西的人 circle n.圆, 圈, 圆形, 圆圈 style n.样式, 风格,…

Unity 算法 之 点集中计算绘制 凸包 的简单整理

Unity 算法 之 点集中计算绘制 凸包 的简单整理 目录 Unity 算法 之 点集中计算绘制 凸包 的简单整理 一、简单介绍 二、Graham扫描法 第一种说明: 第二种说明: 三、代码(第二种说明) 四、参考文献 一、简单介绍 算法&…

工作上的三个境界:能做,能做好,能持续做好

某天,技术岗A员工抬杠管理岗B员工的工作:你的工作啊,实习生都能做,你的价值太小了........一顿DISS。 这样的场景,似曾相识否?这是职场中常见的一类人“杠精”的表现。 做技术的,往往认为管理…

MySQL8.0 OCP最新版1Z0-908认证考试题库整理-006

原题 Choose the best answer.You are having performance issues with MySQL instances. Those servers are monitored withMySQL Enterprise Monitor.Using Query Analyzer, where do you begin to look for problem queries?A) Sort the "Exec" column and check…

什么是物联网?如何保护物联网iot安全性

物联网iot:物联网(IoT)将生活中事物以网络进行连接,彼此交换信息。整个世界借由设备连接成一体。 对于消费者而言,这意味着您可以在大洋彼岸远程调节家中的恒温器。但是对企业而言,物联网不仅创造了连接客户和合作伙伴…

BBR 公平收敛

BBR 的公平收敛来自于两点: ProbeBW 状态加速比收敛:带宽越大,加速比越小。ProbeRTT 状态 RTT 收敛:inflight 越大,越容易让 inflight 小的测到 minrtt 而避免进入 ProbeRTT,inflight 越小,测量…

用Python代码自己写Python代码,竟如此简单

用Python代码自己写Python代码,竟如此简单 Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有“无所不能”的特质。 Python甚至可以代替人,自己写Python代码。而且很简单,只需学会Python的基础知…

RabbitMQ学习笔记

目录 尚硅谷mq视频学习笔记 1.1. MQ 的相关概念 1.1.1. 什么是MQ 1.1.2. 为什么要用MQ 1.1.3. MQ 的分类 1.ActiveMQ 2.Kafka 3.RocketMQ 4.RabbitMQ 1.1.4. MQ 的选择 1.Kafka 2.RocketMQ 3.RabbitMQ 1.2. RabbitMQ 1.2.1. RabbitMQ 的概念 1.2.2. 四大核心概念…

7.7网络(二)

接上篇:7.7 网络(一)_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中,属于端的技术。对于端来…