Python-TCP网络编程基础以及客户端程序开发
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-TCP网络编程基础以及客户端程序开发相关的知识,希望对你有一定的参考价值。
文章目录
一. 网络编程基础
- 什么是IP地址?
IP地址就是标识网络中设备的一个地址
IP地址分为 IPv4 和 IPv6
IPv4使用十进制, IPv6使用十六进制
- 查看本机IP地址:
- linux和mac系统使用 ifconfig
- 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网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序