我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python全栈开发之网络编程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python全栈开发之网络编程

No.1 TCP/IP

早期的计算机网络,都是由厂商规定自己的通信协议,互不兼容,为了把全世界不同类型的计算机连接起来,就必须规定一套全球通用的协议,所以就出现了TCP/IP
Python全栈开发之网络编程

Python全栈开发之网络编程

Python全栈开发之网络编程

No.2 Socket简介

要解决怎么标识一个进制,在一台电脑上可以同pid标识进程,但是在网络上是做不到的,其实TCP/IP就帮我们解决了这个问题,网络层的IP可以标识在网络上的主机,而传输层的协议+端口就可以标识主机中

什么是Socket

socket是进程通信的的一种方式,它与其他进程通信的不同是,它能实现不同主机之间的进程通信,我们网络的应用大多数都是采用这种方式进行通信的

创建Socket

在Python中使用socket模块

import socket
socket.socket(AddressFamily, Type)

函数socket可以创建一个socket对象,该函数存在两个参数

Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET

Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

创建一个tcp套接字

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.close()

创建一个udp套接字

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.close()

Socket函数

bind(address) 将套接字绑定到地址,在AF_INET下,以元祖(hsot,port)的形式表示地址
listen(backlog) 开始监听TCP传入连接,backlog指定可以挂起的最大连接数
accept() 接收TCP连接并返回(conn,address),其中conn是新的套接字对象,address是连接客户端的地址
connect(address) 连接到address处的套接字,以元祖(hsot,port)的形式表示地址,连接出错返回socket.error错误
connect_ex(address) 功能与s.connect(address) ,但是成功返回0,失败返回errno的值
recv(bufsize[,flag]) 接收TCP套接字的数据,数据以字节形式返回,bufsize指定接收的最大数据量,flag提供有关消息的其他信息,通常可以忽略
send(string[,flag]) 发送TCP数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量
sendall(string[],flag) 完整的发送TCP数据,返回之前会尝试发送所有数据,成功返回Nonne,失败抛出异常
recvfrom(bufsize[,flag]) 接收UDP套接字的数据,与s.recv()类似,但返回值是(data,address),data表示接收的数据,address表示发送数据的套接字地址
sendto(string[,flag],address) 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,返回值是发送的字节数
close() 关闭套接字
getpeername() 返回连接套接字的远程地址,返回值是形式为(ipaddr,port)的元组
getsockname() 返回u套接字自己的地址,返回值是形式为(ipaddr,port)的元组
setsockopt(level,optname,value) 设置给定套接字选项的值
setsockopt(level,optname[.buflen]) 返回套接字选项的值
settimeout(timeout) 设置套接字及操作的朝时期,tiemout为一个浮点数,单位是秒,值为None表示永远没有朝时期
setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,非阻塞模式下,如果调用recv()没有接收到任何数据,或send()无法发送数据,将引起socket.error异常

No.3 TCP的三次握手和四次挥手

Python全栈开发之网络编程

Python全栈开发之网络编程

No.4 TCP收发数据

客户端

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 提示用户输入数据
send_data = input("请输入要发送的数据:")
tcp_client_socket.send(send_data.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()

服务端

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定
tcp_server_socket.bind(('',9420))
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)
# 等待连接,产生一个新的socket
client_socket, clientAddr = tcp_server_socket.accept()
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))
# 关闭套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
tcp_server_socket.close()

No.5 TCP文件下载

客户端

from socket import *

def main():
    tcp_client_socket = socket(AF_INET, SOCK_STREAM)
    server_ip = input("请输入服务器ip:")
    server_port = int(input("请输入服务器port:"))
    tcp_client_socket.connect((server_ip, server_port))
    file_name = input("请输入要下载的文件名:")
    tcp_client_socket.send(file_name.encode("utf-8"))
    msg = ''
    while True:
        recv_data = tcp_client_socket.recv(1024)
        msg += recv_data.decode('utf-8')
        if len(recv_data) < 1024:
            break
    if msg:
        with open(file_name + 'bak', "w") as f:
            f.write(msg)

    tcp_client_socket.close()

if __name__ == "__main__":
    main()

服务端

from socket import *
import sys

def get_file_content(file_name):
    """获取文件的内容"""
    try:
        with open(file_name, "rb") as f:
            content = f.read()
        return content
    except:
        print("没有下载的文件:%s" % file_name)

def main():
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    tcp_server_socket.bind(('',9420))
    tcp_server_socket.listen(128)

    while True:
        client_socket, clientAddr = tcp_server_socket.accept()
        recv_data = client_socket.recv(1024)
        file_name = recv_data.decode("utf-8")
        print("对方请求下载的文件名为:%s" % file_name)
        file_content = get_file_content(file_name)
        if file_content:
            client_socket.send(file_content)
        client_socket.close()
    tcp_server_socket.close()

if __name__ == "__main__":
    main()

No.6 TCP的长连接和短连接

TCP长连接

client向server发起连接

server接收到请求,双方建立连接

client向server发送消息

server回应client

一次读写完毕,连接继续

直到client发起关闭请求

TCP短连接

client向server发起连接

server接收到请求,双方建立连接

client向server发送消息

server回应client

一次读写完成,client发起断开连接请求

TCP长/短连接的工作流程

长连接

Python全栈开发之网络编程
短连接

Python全栈开发之网络编程

TCP长/短连接的优缺点

长连接可以省去较多的TCP创建和关闭的操作,减少浪费,节约时间,对于频繁请求资源的场景来说,适合用长连接,但是随着客户端连接越来越多,server端早晚扛不住,这时候就需要采取一些策略,例如关闭一些长时间没有读取的连接,这样可以避免恶意连接,还可以限制每个客户端的最长连接数,这样可以避免某个客户端拖后腿,短连接控制简单,不需要控制手机,但是如果客户频繁的请求资源,那就比较操蛋了,浪费时间,浪费带宽

TCP长/短连接的适用场景

长连接适用于操作频繁,点对点的的通讯,而且连接数不是太多的情况,每个TCP需要三次握手,如果每个操作都是先连接,再操作,会浪费很长的时间,所以每个操作之后我们就不给它断开,再次操作直接发送请求就可以了,例如,数据库

像WEB网站的http服务一般采用短连接,因为长连接对服务器占用的资源太多,而且http服务的连接数一般不会太少,服务器难说能扛得住,所以并发量高的场景,最好采用短连接

No.7 UDP收发数据

from socket import *

udp_socket = socket(AF_INET, SOCK_DGRAM)
dest_addr = ('', 9420)
send_data = input("请输入要发送的数据:")
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
recv_data = udp_socket.recvfrom(1024) 
print(recv_data[0].decode('gbk'))
print(recv_data[1])
udp_socket.close()

No.8 UDP聊天室

import socket

def send_msg(udp_socket):
    msg = input("\n请输入要发送的数据:")
    dest_ip = input("\n请输入对方的ip地址:")
    dest_port = int(input("\n请输入对方的port:"))
    udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))

def recv_msg(udp_socket):
    recv_msg = udp_socket.recvfrom(1024)
    recv_ip = recv_msg[1]
    recv_msg = recv_msg[0].decode("utf-8")
    print(">>>%s:%s" % (str(recv_ip), recv_msg))

def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("", 9420))
    while True:
        print("="*30)
        print("1:发送消息")
        print("2:接收消息")
        print("="*30)
        op_num = input("请输入要操作的功能序号:")
        if op_num == "1":
            send_msg(udp_socket)
        elif op_num == "2":
            recv_msg(udp_socket)
        else:
            print("输入有误,请重新输入...")

if __name__ == "__main__":
    main()

No.9 TCP和UDP

TCP特点

面向连接,通信双方必须建立连接才能进行数据的传输,双方必须为对象分配必要的系统资源,TCP发送的每个报文段都必须得到接收方的应答才认为传输成功,发送端如果在规定时间内没有收到接收端的应答,发送端会将报文段重新发送,TCP还会进行数据校验,还会通过流量控制机制避免主机发送太快而让接收端接收不到数据,完成数据交换后,通信双方必须断开连接,以释放系统资源,这种连接是点对点的,因此TCP不适用广播应用程序

UDP特点

 UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等,由于UDP比较简单, UDP头包含很少的字节,比 TCP 负载消耗少,UDP 适用于不需要 TCP 可靠机制的情形,QQ就是采用的UDP协议

通信模型

TCP

Python全栈开发之网络编程

UDP

Python全栈开发之网络编程

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python全栈开发之网络编程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python全栈开发之网络编程

No.1 TCP/IP早期的计算机网络,都是由厂商规定自己的通信协议,互不兼容,为了把全世界不同类型的计算机连接起来,就必须规定一套全球通用的协议,所以就出现了TCP/IPNo.2 Socket简介要解决怎么标识一个进制,在一台电脑上可以同
2023-01-31

Python全栈开发之并发编程

No.1 线程什么是多任务就是操作系统可以同时运行多个任务,就是可以一边用浏览器上网,同时又可以听歌,还能再撩个×××姐,这就是多任务,操作系统会轮流把系统调度到每个核心上去执行并发和并行并发是指任务数多余cpu核数,通过操作系统的各种任务
2023-01-31

Python全栈开发之---assert

一、python assert的作用:根据Python 官方文档解释(https://docs.python.org/3/reference/simple_stmts.html#assert), "Assert statements are
2023-01-30

Python全栈开发之Git

No.1 Git特点版本控制:可以解决多人同时开发的代码问题,也可以找回历史代码分布式:Git是一个分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,首先会有一台计算机充当服务器,这台计算机7*24小时服务,其他计算机都是从这台
2023-01-31

python全栈开发之Python基础(

一、 基础知识python的运行方式有两种:第一种通过交互式的运行方式,通过 "开始"—>"所有程序" —> "python3.x" —>"IDLE" 运行。第二种是我们写好的Python文件双击运行。 Python的帮助系统 hel
2023-01-31

Python全栈开发之---mysql数

1、数据库的安装和连接 1 #数据库安装 2 pip install PyMySQL 3 4 #数据库操作 5 import pymysql 6 7 db = pymysql.connect("数据库ip","用户","密码","数据库
2023-01-30

Python全栈开发之函数

No.1 函数介绍所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用函数的使用有两个步骤:1、定义函数2、调用函数函数的作用,代码重用,提高开发效率No.2 定义和调用定义函数的格式如下:def 函数名(): 函数
2023-01-31

Python全栈开发之Django基础

No.1 MVC&MTVMVCM全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作V全拼为View,用于封装结果,生成页面展示的html内容C全拼为Controller,用于接收请求,处理业务逻辑,与Mode
2023-01-31

Python全栈开发之---装饰器

1、装饰器的形成过程 1 import time 2 3 def func1(): 4 print('in func1') 5 6 def timer(func): 7 def inner(): 8 st
2023-01-30

Python全栈开发之Django进阶

No.1 静态文件处理项目中CSS、JS、图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静态文件的机制,文件可以放在项目目录下,也可以放在应用目录下
2023-01-31

Python全栈开发之基础语法

No.1 Python语言介绍详情见百度百科。。。No.2 Python是一门怎么样的语言详情在百度百科。。。No.3 Python能做什么网络应用、桌面应用、系统运维、机器学习、科学计算。。。网络应用 Django/Flask/Torna
2023-01-31

Python全栈开发之文件操作

No.1 文件的概念文件的概念和作用计算机中的文件,就是存储在某种长期储存设备上的一段数据流 计算机中的文件,可以在需要的时候使用文件的存储方式文本文件可以使用文本编辑器查看本质上还是二进制文件二进制文件保留的内容不能直接查看,而是提供给其
2023-01-31

Python全栈开发之面向对象

No.1 概念面向对象的特点?注重对象和指责,不同的对象承担各自的指责更加适合对复杂的需求变化,专门应对复杂项目开发,提供固定的套路面向对象强调的是谁来做,面向过程强调的如何做什么是类类是对一群具有相同特征或者行为的事物统称,是抽象的,不能
2023-01-31

Python全栈开发之异常处理

No.1 异常的概念程序在运行过程中,遇到一个错误,会停止程序的运行,并且提示一些错误信息,这就是异常程序停止执行并且提示错误信息这个动作,称为抛出异常No.2 捕获异常简单捕获异常格式捕获异常最简单的语法格式:try: 尝试执行的代
2023-01-31

Python全栈开发之常用模块

No.1 syssys模块是与Python解释器交互的一个接口sys.argv 命令行参数List,第一个元素是程序本身路径sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)sys.version
2023-01-31

网络编程-SOCKET开发

网络编程-SOCKET开发B/S架构       B指的是web(网页),S指的是Server(服务端软件)C/S架构       C指的是Client(客户端软件),S指的是Server(服务端软件)OSI七层模型设计的目的是成为一个所有
2023-01-31

python网络编程之socketser

防伪码:存在的,忘却了,红尘万丈,入眸幻灭  在进行网络编程前我们先来说说在网络中服务器与客户端是如何交互的,也就是传说中的TCP三次握手。  三次握手的目的是为了确认客户端与服务端都能接收到对方的信息,以下是三次握手的详细过程:    第
2023-01-31

Python网络编程之协程

What is the association?与子例程一样,协程也是一种程序组件。 相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。 协程源自Simula和Modula-2语言,但也有其他语言支持。 协程更适合于用来
2023-01-31

Python进阶之网络编程

网络通信使用网络的目的把多方链接在一起,进行数据传递;网络编程就是,让不同电脑上的软件进行数据传递,即进程间通信;ip地址ip地址概念和作用IP地址是什么:比如192.168.1.1 这样的一些数字;ip地址的作用:用来在电脑中 标识唯一一
2023-01-31

python编程之网络基础

1 套接字是一种具有通讯端点概念的计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必须要建立套接字。套接字起源于20世纪70年代,有时人们把套接字成为“伯克利套接字”或“BSD套接字”,期初,套接字被设计用在同一台主机上多个应用程序
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录