2024-06-13
Python
00

目录

了解网络编程的基本概念
网络编程与通信协议
掌握TCP/IP协议
TCP/IP协议
TCP协议与UDP协议的区别
掌握Socket套接字
熟练应用TCP编程
TCP编程服务器端流程如下
TCP编程客户端流程如下
TCP编程服务器端多次通讯代码
TCP编程客户端多次通讯代码
熟练应用UDP编程
模拟客服咨询的小程序
本章总结

了解网络编程的基本概念

网络编程与通信协议

协议即规则,就好比汽车上路要遵守交通规则一样,为了使全世界不同类型的计算机都可以连接起来,所以制定了一套全球通用的通信协议Internet协议。有了Internet协议,任何私有网络,只要支持这个协议,就可以接入互联网

image.png

掌握TCP/IP协议

TCP/IP协议

  • IP协议是整个TCP/IP协议族的核心

  • IP地址就是互联网上计算机的唯一标识

  • 目前的IP地址有两种表示方式,即IPv4和IPv6

  • 在命令行下使用ipconfig命令可以查看本机的IP地址

  • TCP(Transmission Control Protocol)协议:即传输控制协议,是建立在IP协议基础之上的。

  • TCP协议负责两台计算机之间建立可靠连接,保证数据包按顺序发送到。

  • 它是一种可靠的、一对一的、面向有连接的通信协议。

    image.png

    image.png

    image.png

    image.png

TCP协议与UDP协议的区别

TCP协议UDP协议
连接方面面向连接的面向无连接的
安全方面传输消息可靠、不丢失、按顺序到达无法保证不丢包
传输效率方面传输效率相对较低传输效率高
连接对象数量方面只能是点对点、一对一支持一对一、一对多、多对多的交互通讯

掌握Socket套接字

  • 我们编写网络通讯程序,就会用到这个套接字

    image.png

  • Socket对象的常用方法

    方法名称功能描述
    bind((ip,port))绑定IP地址和端口
    listen(N)开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5
    accept()被动接收TCP客户端连接,阻塞式
    connect((ip, port))主动初始化TCP服务器连接
    recv(size)接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量
    send(str)发送TCP数据,返回值是要发送的字节数量
    sendall(str)完整发送TCP数据,将str中的数据发送到连接的套接字,返回之前尝试发送的所有数据,如果成功为None,失败抛出异常
    recvfrom()接收UDP数据,返回值为一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址
    sendto(data,(ip,port))发送UDP数据,返回值是发送的字节数
    close()关闭套接字

熟练应用TCP编程

TCP编程服务器端流程如下

  1. 使用 socket 类创建一个套接字对象
  2. 使用 bind((ip,port)) 方法绑定ip地址和端口号
  3. 使用 listen() 方法开始TCP监听
  4. 使用 accept() 方法等待客户端的连接
  5. 使用 recv()/send() 方法接收/发送数据
  6. 使用 close() 关闭套接字

TCP编程客户端与服务器启动运行有先后,先启动运行服务器端,再启动运行客户端,连接建立之后,双方谁先发送数据均可

python
from socket import socket, AF_INET, SOCK_STREAM # AF_INET 用于Internet之间的进程通讯 # SOCK_STREAM 表示的用的TCP协议编程 # (1)创建 socket 对象 server_socket = socket(AF_INET, SOCK_STREAM) # (2)绑定IP地址和端口 ip = '127.0.0.1' # 等同于local port = 8888 # 端口 server_socket.bind((ip, port)) # (3)使用 listen() 开始监听 server_socket.listen(5) print('服务器已启动') # (4)等待客户端的连接 client_socket, client_addr = server_socket.accept() # 系列解包赋值 # (5)接收来自客户端的数据 data = client_socket.recv(1024) print('客户端发送过来的数据为:', data.decode('utf-8')) # 要求客户端发过来的数据是使用utf-8进行编码的 # (6)关闭socket server_socket.close()

TCP编程客户端流程如下

  1. 使用 socket 类创建一个套接字对象

  2. 使用 connect((host, port)) 设置连接的主机IP和主机设置的端口号

  3. 使用 recv()/send() 方法接收/发送数据

  4. 使用 close() 关闭套接字

    python
    import socket # (1)创建socket对象 client_socket = socket.socket() # 客户端不需要参数 # (2)IP地址和主机端口,向服务器端发送连接请求 ip = '127.0.0.1' port = 8888 client_socket.connect((ip, port)) print('-------与服务器连接建立成功-------') # (3)发送数据 client_socket.send('Welcome to python world'.encode('utf-8')) # (4)关闭 client_socket.close() print('发送完毕')

    image.png

TCP编程服务器端多次通讯代码

python
# 导入socket import socket # (1)创建 socket 对象 socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # (2)绑定IP地址和端口 socket_obj.bind(('127.0.0.1', 8888)) # (3)设置最大的连接数量 socket_obj.listen(5) # (4)等待客户端的TCP连接 client_socket, client_addr = socket_obj.accept() # (5)接收数据 info = socket_obj.recv(1024).decode('utf-8') # while 循环的四个步骤 info 是初始化变量 while info != 'bye': # 条件判断 if info != '': print('接收到的数据是:', info) # 准备发送的数据 data = input('请输入要发送的数据:') # 服务端回复客户端 socket_obj.send(data.encode('utf-8')) if data == 'bye': break # 19行到27行是循环 info = socket_obj.recv(1024).decode('utf-8') # 改变变量 # (6)关闭socket client_socket.close() socket_obj.close()

TCP编程客户端多次通讯代码

python
import socket # (1)创建socket对象 client_socket = socket.socket() # (2)IP地址和主机端口 client_socket.connect(('127.0.0.1', 8888)) print('-------服务器连接建立成功-------') # (3)客户端先发送数据 info = '' while info != 'bye': send_data = input('请客户端输入要发送的数据') client_socket.send(send_data.encode('utf-8')) # 判断 if info == 'bye': break # 接收数据 info = client_socket.recv(1024).decode('utf-8') print('收到服务器的响应数据是:', info) # (4)关闭 client_socket.close()

熟练应用UDP编程

  • UDP协议又被称为用户数据包协议(User Datagram Protocol),它是面向无连接的协议,只要知道对方的IP地址和端口,就可以直接发送数据包,由于是面向无连接的,所以无法保证数据一定会到达接收方。

  • UDP客户端和服务器端通讯模型

    image.png

  • UDP编程客户端发送方代码

    python
    from socket import socket, AF_INET, SOCK_DGRAM # (1)创建socket对象 send_socket = socket(AF_INET, SOCK_DGRAM) # (2)准备发送数据 data = input('请输入要发送的数据:') # (3)指定接收方的ip和端口 ip_port = ('127.0.0.1', 8888) # (4)发送数据 send_socket.sendto(data.encode('utf-8'), ip_port) # 接收来自接收方的回复数据 recv_data, addr = send_socket.recvfrom(1024) print('接收到的数据为:', recv_data.decode('utf-8')) # (5)关闭socket send_socket.close()
  • UDP编程服务端接收方代码

    python
    from socket import socket, AF_INET, SOCK_DGRAM # (1)创建socket对象 recv_socket = socket(AF_INET, SOCK_DGRAM) # (2)绑定ip地址和端口 recv_socket.bind(('127.0.0.1', 8888)) # (3)接收来自发送方的数据 recv_data, addr = recv_socket.recvfrom(1024) print('接收到的数据为:', recv_data.decode('utf-8')) # (4)准备回复对方的数据 data = input('请输入要回复的数据') # (5)回复 recv_socket.sendto(data.encode('utf-8'), addr) # (6)关闭 recv_socket.close()
  • UDP编程接收方与发送方启动运行无先后,但先启动运行发送方,数据包会丢失

模拟客服咨询的小程序

  • 客服人员服务端的代码

    python
    from socket import socket, AF_INET, SOCK_DGRAM # (1)创建socket对象 recv_socket = socket(AF_INET, SOCK_DGRAM) # (2)绑定ip地址和端口 recv_socket.bind(('127.0.0.1', 8888)) while True: # (3) 接收发送过来的数据 recv_data, addr = recv_socket.recvfrom(1024) print('客户说:', recv_data.decode('utf-8')) if recv_data.decode('utf-8') == 'bye': break # (4)准备回复对方的数据 data = input('客服回:') # (5)发送 recv_socket.sendto(data.encode('utf-8'), addr) # (6)关闭socket对象 recv_socket.close()
  • 客户端代码

    python
    from socket import socket, AF_INET, SOCK_DGRAM # (1)创建socket对象 send_socket = socket(AF_INET, SOCK_DGRAM) while True: # (2)准备发送的数据 data = input('客户说:') # (3)发送 send_socket.sendto(data.encode('utf-8'), ('127.0.0.1', 8888)) if data == 'bye': break # (4)接收来自客服人员回复的信息 recv_data, addr = send_socket.recvfrom(1024) print('客服回:', recv_data.decode('utf-8')) # (5)关闭 send_socket.close()

本章总结

  1. 网络编程:在程序中实现网络计算机之间的数据通信
  2. 通信协议:接入网络所要遵守的“规则”,目前全球通用的通信协议即Internet协议
  3. TCP/IP协议:中译为“传输控制协议”/“因特网互联协议"
  4. TCP/IP协议所对应的四层从下到上分别为:网络接口层、网际层、传输层、应用层
  5. 传输层的协议有:TCP协议、UDP协议
  6. TCP协议:面向连接的,可靠的、不丢失的、按顺序到达,但传输效率相对较低,只能实现点对点,一对一的数据传输
  7. UDP协议:面向无连接,无法保证不丢包,但传输效率高,可以实现一对一、一对多,多对多的交互通信
  8. python中的内置模块socket支持TCP与UDP的编程

本文作者:柯南

本文链接:

版权声明:©2024 柯南 All rights reserved.