Python进阶-网络编程-02

Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架

4.1. tcp简介

  • 定义:TCP是面向连接的、可靠的、基于字节流的传输控制协议
  • TCP的特点
    • 面向连接
    • 可靠传输
      • 应答机制
      • 超时重传
      • 错误校验
      • 流量管控
  • TCP通信模型:TCP严格区分客户端、服务端

4.2. tcp网络程序-客户端

  • 代码示例

    # 1.导入socket模块
    import socket
    
    # 2.创建socket套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 3.建立tcp连接(和服务端建立连接)
    tcp_client_socket.connect(("192.168.70.1",8080))
    
    # 4.开始发送数据(到服务端)
    tcp_client_socket.send("约吗".encode("gbk"))
    
    # 5.接收数据
    recv_data = tcp_client_socket.recv(1024)
    print(recv_data.decode("gbk"))
    
    # 6.关闭套接字
    tcp_client_socket.close()
    

4.3. tcp网络程序-服务器

  • listen()函数

    # 开启监听,把套接字由主动变为被动,128代表客户端最大连接数量
    tcp_server_socket.listen(128)
    
  • accept()函数

    # accept开始等待客户端连接,程序进入阻塞状态
    new_client_socket,client_ip_port = tcp_server_socket.accept()
    new_client_socket 新的套接字,只是服务当前的客户端
    client_ip_port 客户端端口和ip地址
    
  • 代码示例

    import socket
    
    # 1.socket创建一个套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2.绑定端口
    tcp_server_socket.bind(("",8080))
    
    # 3.listen使套接字变为可以被动链接(监听模式)
    # 128代表最大连接客户端的数量,windows系统有效,linux系统无效
    tcp_server_socket.listen(128)
    
    # 4.accept等待客户端的链接
    # accept开始等待客户端连接,程序进入阻塞状态
    new_client_socket,client_ip_port = tcp_server_socket.accept()
    print("新客户端来了:%s" % str(client_ip_port))
    
    # 5.recv/send接收发送数据
    recv_data = new_client_socket.recv(1024)
    print("接收到[%s]的信息:%s" % (str(client_ip_port),recv_data.decode("gbk")))
    # 表示不再和当前的客户端通信
    new_client_socket.close()
    
    # 表示程序不再接受新的客户端的连接,已经连接的可以继续服务
    tcp_server_socket.close()
    

4.4. tcp网络程序-服务器增强

  • 代码示例:

    import socket
    
    # 1.socket创建一个套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2.bind绑定ip和pot
    tcp_server_socket.bind(("",8080))
    
    # 3.listen使套接字变为可以被动链接(监听模式)
    # 128代表最大连接客户端的数量,windows系统有效,linux系统无效
    tcp_server_socket.listen(128)
    
    while True:
        # 4.accept等待客户端的链接
        # accept开始等待客户端连接,程序进入阻塞状态
        new_client_socket,client_ip_port = tcp_server_socket.accept()
        print("新客户端来了:%s" % str(client_ip_port))
    
        # 5.recv/send接收发送数据
        while True:
            recv_data = new_client_socket.recv(1024)
            # 当接收数据为空时,表示客户端已经断开,服务器也应该断开
            if recv_data:
                recv_text = recv_data.decode("gbk")
                print("接收到[%s]的信息:%s" % (str(client_ip_port),recv_text))
            else:
                print("客户机断开连接")
                break
        # 表示不再和当前的客户端通信
        new_client_socket.close()
    
    # 表示程序不再接受新的客户端的连接,已经连接的可以继续服务
    tcp_server_socket.close()
    

4.5. 案例:文件下载器

  • 下载过程

    """
    D:/mydocument/Python/源文件/02_python进阶/day04/1.txt
    to
    d:/Users/Desktop/1.txt
    """
    
  • 客户端

    1. 导入模块
    2. 创建套接字
    3. 建立连接
    4. 接收用户输入的文件名
    5. 发送文件名到服务端
    6. 创建文件,并且准备保存
    7. 接收服务端发送的数据,保存到本地(循环)
    8. 关闭套接字
    # 1.导入模块
    import socket
    
    # 2.创建套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 3.建立连接
    tcp_client_socket.connect(("127.0.0.1",8080))
    
    # 4.接收用户输入的文件名
    file_name = input("请输入下载的文件名:\n")
    
    # 5.发送文件名到服务端
    tcp_client_socket.send(file_name.encode("gbk"))
    
    # 6.创建文件,并且准备保存
    with open("d:/Users/Jq/Desktop/"+file_name,"wb") as file:
      
        # 7.接收服务端发送的数据,保存到本地
        while True:
            file_data = tcp_client_socket.recv(1024)
            if file_data:
                file.write(file_data)
            else:
                break
                
    # 8.关闭套接字
    tcp_client_socket.close()
    
  • 服务器

    1. 导入模块
    2. 创建套接字
    3. 绑定端口
    4. 设置监听,设置套接字由主动为被动
    5. 接受客户端连接
    6. 接收客户端发送的文件名
    7. 根据文件名读取文件内容
    8. 把读取的内容发送给客户端(循环)
    9. 关闭和当前客户端的连接
    10. 关闭服务器
    # 1.导入模块
    import socket
    
    # 2.创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 消除2MSL的等待 MSL:报文最大生存时间
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    
    # 3.绑定端口
    tcp_server_socket.bind(("",8080))
    
    # 4.设置监听,设置套接字为被动
    tcp_server_socket.listen(128)
    
    # 5.接收客户端连接
    
    while True:
        new_client_socket,ip_port = tcp_server_socket.accept()
        print("欢迎新客户端",ip_port)
        # 6.接收客户端发送的文件名
        recv_data = new_client_socket.recv(1024)
        file_name = recv_data.decode("gbk")
        print(file_name)
        
        try:
            # 7.根据文件名读取文件内容
            with open(file_name,"rb") as file:
                # 8.把读取的内容发送到客户端
                while True:
                    file_data = file.read(1024)
                    if file_data:
                        new_client_socket.send(file_data)
                    else:
                        break
        except Exception as e:
            print("下载%s失败" % file_name)
        else:
            print("下载%s成功" % file_name)
        # 9.关闭和当前客户端的连接
        new_client_socket.close()
    
    # 10.关闭套接字
    tcp_server_socket.close()
    

4.6. tcp的3次握手

  • 概念:三次握手是TCP建立连接的时候发送的三个数据包
    1. 概念
    2. 简单描述通信过程
    3. 必须是3次,如果少于3次,会造成系统资源的浪费

4.7. tcp的4次挥手

  • 概念:TCP断开连接的时候发送的4个数据包,确保断开连接
    1. 概念
    2. 简单描述过程
    3. 必须是4次
    4. 主动发起断开的一方,必须等待2MSL时间

4.8. IP地址和域名

  • ip地址
    • ip地址网络中计算机的唯一标识,点分10进制构成
    • ipv4和ipv6
  • 域名
    • Doman name
    • 因为网络通信需要使用ip地址,但是ip地址不容易记忆,所以才有了更好记忆的域名
    • 特殊域名:localhost

4.9. DNS及浏览器请求服务器的过程

  • 浏览器输入网址–>本地DNS服务器查询ip–>远程DNS服务器–>建立TCP连接
  • 本地DNS服务器是一个文件
    • Windows C:\Windows\System32\drivers\etc\hosts
    • Ubuntu /etc/hosts

4.10. HTTP协议概述

  • 定义:http 协议,超文本传输协议,主要用来发布和传输html页面(网页)

  • http协议组成

    • 请求协议
    • 响应协议
  • http协议构成

    • 由协议项来构成

    • 协议项

      1. 协议名
      2. 协议值

4.11. HTTP协议格式查看

  • 谷歌
    • 右键–>检查–>network–>刷新
    • 更多–>开发者工具
    • F12
  • 火狐
    • 右键–> 检查元素–>网络–>刷新

4.12. HTTP请求报文格式

  • 请求报文格式

    1. 请求行

      • 请求方式 资源路径 协议及版本\r\n
    2. 请求头

      • 协议项

        协议名:协议值\r\n

    3. 请求空行

      • 作用:分隔请求头和请求的主体
    4. 请求主体

      • 浏览器要发给服务器的内容
      • get方式没有请求体,post方式才有请求体

4.13. HTTP响应报文格式

  • 响应报文格式

    1. 响应行

      • 协议及版本 状态码 状态描述\r\n

        常见的状态码

        200 一切正常

        404 客户端请求的资源不存在

        302 重定向

    2. 响应头

      • 协议项构成

        协议名:协议值\r\n

    3. 响应空行

      • 作用:分隔响应头和响应主体
    4. 响应主体

      • 服务器响应给客户端的数据

4.14. 长连接和短连接

  • 长连接:一次连接,多次数据传输,通信结束关闭连接

    特点:要不连不上,一旦连接上,速度有保证,当瞬间访问压力比较大的时候,服务器不可用

  • 短连接:一次连接,一次传输,就关闭

    特点:会频繁的建立和断开连接,当瞬间访问压力比较大的时候,服务器响应过慢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值