Python-TCP网络编程基础以及客户端程序开发

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-TCP网络编程基础以及客户端程序开发相关的知识,希望对你有一定的参考价值。

文章目录

一. 网络编程基础

- 什么是IP地址?

IP地址就是标识网络中设备的一个地址
IP地址分为 IPv4 和 IPv6
IPv4使用十进制, IPv6使用十六进制

  • 查看本机IP地址:
  1. linux和mac系统使用 ifconfig
  2. windwos系统使用 ipconfig

- 什么是端口和端口号?

端口是传输数据的通道,是数据传输的必经之路,而每一个端口都有对应的端口号,想要找到端口通过端口号即可
端口号是端口的表示
端口分类: (0-65535)
1. 知名端口号: 0-1023
2. 动态端口号: 1024-65535

IP+端口 可以确定网络中唯一的应用程序

- TCP介绍

数据不能随意传输, 在发送之前还需要选择一个对应的传输协议, 保证程序之间按照指定的传输规则进行数据的通信
TCP全称 Transmission Control Protocol,简称 传输控制协议, 它是一种面向连接的, 可靠的, 基于字节流的传输层通信协议
TCP的特点:

  • 面向连接:
    - 通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源
  • 可靠传输:
    - TCP 采用发送应答机制
    - 超时重传
    - 错误校验
    - 流量控制和阻塞管理

- socket介绍

socket简称 套接字, 是进程之间通信的一个工具, 好比现实生活中的插座, 所有的家用电器想要工作都是基于插座的, 而进程之间想要进行网络通信需要基于socket
作用: 负责进程之间的网络数据传输, 好比数据的搬运工

二. TCP客户端程序开发

"""
程序架构:
    B/S: brower/server(浏览器/服务器), 想要使用某个服务,只需要浏览器即可
    C/S: Client/Server(客户端/服务器), 想要使用某个服务,必须下载它对应的客户端软件

客户端连接服务器过程: (发送信息和接受信息可以重复执行)
    1. 创建对象
    2. 建立连接
    3. 发送信息
    4. 接收信息
    5. 关闭连接
    # 上述只是客户端的,服务端使用网络调试助手

客户端开发流程:
Python中先要使用socket, 必须先导入 socket模块
    1. 创建 socket 对象   socket.socket()
    2. 和服务器建立连接   socket对象.connect()
    3. 发送信息   socket对象.send()
    4. 接受对方发送的信息   socket对象.recv()
    5. 关闭连接   socket对象.close()

Python中的字符串:
Python中的字符串可以分为两种
    1. str
    2. bytes: 字节, 二进制, 网络中数据的传输都是bytes类型

使用 type(变量值) 查看变量类型
str --> bytes: str类型.encode(编码类型)
bytes --> str: bytes类型.decode(编码类型)
常用编码类型: gkb 和 utf-8,这两种编码类型,都是处理中文字符串
    1. gbk处理方式: 将一个中文字符编码为 2 个字节
    2. utf-8处理方式: 将一个中文字字符编码为 3 个字节
"""
import socket


if __name__ == '__main__':
    # 1.创建socket对象  socket.socket(ip类型, 协议)
    # socket.AF_INET 代表IPV4   socket.AF_INET6 代表IPV6
    # SOCK_STREAM 代表TCP
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 固定写法

    # 2. 和服务器建立连接   socket对象.connect((服务器IP地址, 端口号))  类型是元组
    client_socket.connect(("192.168.218.1", 8080))
    print("连接建立成功")

    # 3. 发送信息   socket对象.send(发送的信息)  需要是bytes类型
    send_data = "hello world!!!!".encode()  # 默认是utf-8
    client_socket.send(send_data)

    # 4. 接受对方发送的信息  socket对象.recv(一次接收多少字节的数据)
    # 注意: 如果对方没有发送信息, recv函数会在此阻塞等待
    buf = client_socket.recv(4096)
    try:
        print(buf.decode())  # 接受信息也是bytes 所以需要转换一下,默认是utf-8
    except UnicodeDecodeError:
        print(buf.decode('gbk'))  # 也有可能是 gkb编码, 所以需要捕捉一下异常

    # 5. 关闭连接  socket对象.close()
    client_socket.close()

三. 扩展

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

  • send原理解剖:

send并不是直接把数据发送给服务器端, 想要发送数据, 就必须使用网卡进行发送, 而应用程序是无法直接通过网卡发送数据的, 需要调用系统接口, 也就是说
应用程序把发送的信息先写到发送缓存区, 再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡

  • recv原理解剖:

同理, 应用程序也无法直接通过网卡接收数据, 也需要调用系统接口, 由操作系统通过网卡接收数据, 把接收的数据写入缓冲区, 应用程序再从缓冲区获得客户端发送的信息

以上是关于Python-TCP网络编程基础以及客户端程序开发的主要内容,如果未能解决你的问题,请参考以下文章

python-tcp粘包

python-TCP传输模型

python-TCP模拟ftp文件传输

python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序

Java网络编程基础-- 基于TCP/IP的Socket编程

Python基础笔记系列十三:socket网络编程