python网络编程
目录
网络基础
TCP协议
UDP协议
Socket简介
案例一:TCP编程
案例二:UDP编程
案例三:简易的聊天应用
网络基础
网络编程是指计算机网络进行信息交换与通信的技术,网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。在计算机网络中,最常见的两种通信协议是TCP和UDP。
TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议,提供可靠的、按顺序到达的通信服务。TCP 协议通过三次握手建立连接,并通过四次挥手断开连接。其主要特点如下:
- 面向连接:TCP 需要在数据传输前建立连接。数据传输之前,发送方和接收方需要通过三次握手来确认连接的可靠性。
- 可靠性:TCP 通过序列号、确认应答、重传机制等方式保证数据的可靠传输。如果数据丢失或损坏,TCP 会自动进行重传。
- 流量控制:TCP通过滑动窗口技术来控制数据传输速率,防止接收方处理不过来数据。
- 有序性:数据包的接收顺序由 TCP 保证,接收方会按序号将数据重新组装。
UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它的主要特点是简单、快速,但不保证数据的可靠性和顺序。UDP 协议的主要特点如下:
- 无连接:UDP 不需要建立连接,因此通信双方无需进行握手。
- 不可靠传输:UDP 不提供确认应答机制,也不保证数据到达的顺序,可能会丢包或出现乱序的情况。
- 速度较快:由于不需要建立连接和处理数据传输的复杂性,UDP 在传输过程中速度较快,适合用于实时性要求较高的应用场景。
- 适用于广播和多播:UDP 支持广播和多播,可以在网络中同时向多个接收方发送数据。
Socket简介
Socket 是网络通信的基础,是实现网络编程的抽象层。在 Python 中,socket 模块提供了对 Socket 的封装,使得我们可以轻松实现 TCP 和 UDP 通信。ocket 接口提供了发送、接收、连接、断开等操作,允许我们在程序中实现网络通信。
- IPV4 和 IPv6:Socket 支持 IPv4 和 IPv6 协议,通过指定不同的地址族(AF_INET 表示 IPv4,AF INET6 表示 IPv6)可以支持不同的网络环境。
- 协议类型:Python的 Socket 模块支持两种主要的协议类型:SOCK STREAM 表示 TCP 协议,SOCK DGRAM 表示 UDP 协议。
案例一:TCP编程
TCP服务端配置:
import socketdef tcp_server():#创建一个TCP服务器socketserver_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_socket.bind(('192.168.10.101',12345))#开始监听连接,最大连接数为5server_socket.listen(5)print('Server is listening...')while True:#接受用户端连接client_socket,client_address=server_socket.accept()print(f'Connection from {client_address}')#接收客户端信息message=client_socket.recv(1024)print(f'Received message:{message.decode("utf-8")}')#发送响应client_socket.send(b'Hello,Client') #发送响应数据,需要编码成字节形成#关闭连接client_socket.close()if __name__=='__main__':tcp_server()
解释:
- server_socket.bind(('192.168.10.101',12345)):绑定服务器的 IP 地址和端口。
- server_socket.listen(5):开始监听连接,最大连接数为5。
- server_socket.accept():接受客户端连接。
- client socket.recv(1024):接收客户端消息。
- client socket.send(b'Hello,client'):向客户端发送响应消息。
- client socket.close():关闭与客户端的连接。
TCP客户端配置:
import socketdef tcp_client():#创建一个TCP客户端socket#AF_INET表示IPv4协议,SOCK_STREAM表示TCP协议client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接到服务器(ip和端口)client_socket.connect(('192.168.10.101',12345))#发送数据message='hello,Server'client_socket.send(message.encode('utf-8')) #发送数据时需要进行编码#接收服务器响应response=client_socket.recv(1024) #连接最多1024字节的数据print('Received from server:',response.decode('utf-8')) #接收到的数据需要解
码#关闭连接client_socket.close()if __name__=='__main__':tcp_client()
解释
- socket,socket(socket,AF INET,socket.SOCK STREAM):创建一个TCP 客户端Socket,使用IPv4 地址族(AF INET)和TCP 协议(SOCK STREAM)。
- client_socket.connect(('192.168.10.101',12345)):通过 IP 地址和端口连接到服务器。
- client_socket.send():将数据发送到服务器,数据需要进行编码(encode('utf-8'))。
- client _socket.recv():接收来自服务器的数据,最多接收 1024 字节。
- client socket.close():关闭客户端Socket连接
服务器验证:
客户端验证:
案例二:UDP编程
服务器配置:
import socketdef udp_server():#创建UDP服务器socketserver_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#绑定服务器地址和端口server_socket.bind(('192.168.10.101',12345))print('Server is listening...')while True:#接收客户端信息message,client_address=server_socket.recvfrom(1024) #接收数据和客户端地址print(f'Received message:{message.decode("utf-8")}')#发送响应server_socket.sendto(b'Hello,UDP Client',client_address) #向客户端发送响应if __name__=='__main__':udp_server()
解释
- socket.socket(socket.AF INET,socket.SOCK DGRAM):创建 UDP 客户端 Socket。
- client_socket.sendto():发送数据到指定的目标地址和端口。
- client_socket.recvfrom():接收来自服务器的响应,返回接收到的数据和服务器地址。
客户端配置:
import socketdef udp_client():#创建UDP客户端socketclient_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#发送数据message='Hello, UDP Server'client_socket.sendto(message.encode('utf-8'),('192.168.10.101',12345)) #发>送数据并指定目标地址#接收服务器响应response,server_address=client_socket.recvfrom(1024) #接收数据和服务器地址print('Received from server:',response.decode('utf-8'))#关闭socketclient_socket.close()if __name__=='__main__':udp_client
解释
- server socket.bind(('192.168.10.101',12345)):绑定服务器的 IP 地址和端口。
- server _socket.recvfrom(1024):接收来自客户端的数据,并返回数据和客户端地址
- server socket.sendto():向指定客户端地址发送响应数据。
服务端验证:
客户端验证:
案例三:简易的聊天应用
服务器配置:
import sockethost='192.168.10.101'
port=12345s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))s.listen(1)sock,addr=s.accept()print('建立连接成功')info=sock.recv(1024).decode()while info != 'bye':if info:print('收到的信息是:'+info)send_data=input('请输入你要发送的信息:')send_data=str(send_data)sock.send(send_data.encode())if send_data=='bye':breakinfo=sock.recv(1024).decode()
sock.close()
s.close()
客户端配置:
import socket
s=socket.socket()host='192.168.10.101'
port=12345s.connect((host,port))print('已经建立了连接')info=''
while info != 'bye':send_data=input('请输入你要发送的信息:')send_data=str(send_data)s.send(send_data.encode())if send_data=='bye':breakinfo=s.recv(1024).decode()print('接收到的信息是:'+info)
s.close()
服务器验证:
客户端验证: