目录
1,网络基础
网络编程是指通过计算机网络进行信息交换与通信的技术。网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。在计算机网络中,最常见的两种通信协议是 TCP 和 UDP。
1,TCP协议
TCP(传输控制协议)是一种面向连接的协议,提供可靠的、按顺序到达的通信服务。TCP 协议通过三次握手建立连接,并通过四次挥手断开连接。其主要特点如下:
- 面向连接: TCP 需要在数据传输前建立连接。数据传输之前,发送方和接收方需要通过三次握手来确认连接的可靠性。
- 可靠性: TCP 通过序列号、确认应答、重传机制等方式保证数据的可靠传输。如果数据丢失或损坏,TCP 会自动进行重传。
- 流量控制: TCP通过滑动窗口技术来控制数据传输速率,防止接收方处理不过来数据
- 有序性: 数据包的接收顺序由TCP保证,接收方会按序号将数据重新组装。
2,UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它的主要特点是简单、快速,但不保证数据的可靠性和顺序。UDP协议的主要特点如下:
- 无连接: UDP 不需要建立连接,因此通信双方无需进行握手。
- 不可靠传输: UDP 不提供确认应答机制,也不保证数据到达的顺序,可能会丢包或出现乱序的情况。
- 速度较快: 由于不需要建立连接和处理数据传输的复杂性,UDP 在传输过程中速度较快,适合用于实时性要求较高的应用场景。
- 适用于广播和多播: UDP支持广播和多播,可以在网络中同时向多个接收方发送数据。UDP 适用于那些对实时性要求较高,但不要求数据可靠性保障的场景,例如在线游戏、视频会议等。
3,socket简介
Socket(套接字)是计算机网络中进程间通信的一种工具,用于实现不同设备或同一设备上不同进程之间的数据传输。它是操作系统提供的网络编程接口,本质上是一个抽象的端点,可以看作是两个程序之间通信链路的 “端点”。
在 TCP/IP 协议模型中,Socket 通过IP 地址(标识网络中的设备)和端口号(标识设备上的进程)唯一确定一个通信端点。例如,客户端通过连接服务器的 IP 地址和端口号,建立 Socket 连接,从而实现数据交互。
Socket 的核心作用是实现不同主机或进程之间的双向通信,
-
跨网络通信:连接不同设备允许位于不同物理位置的计算机通过网络(如互联网)进行数据交换。例如,浏览器通过 Socket 连接 Web 服务器获取网页内容。
-
同一主机内的进程通信:除了跨网络通信,Socket 也可用于同一台计算机上不同进程间的通信(称为本地套接字)。例如,数据库服务与应用程序通过本地 Socket 高效交互,无需经过网络协议栈,性能更高。
二,TCP编程
通过python编程,可以设计一个简单的TCP聊天应用,客户端和服务器通过TCP协议进行通信,客户端发送信息,服务器接收并返回响应
注意:在101服务器进行操作
[root@localhost ~]# vim tcp.py ##编写tcp客户端
import socket
host='192.168.10.101'
port=12345
s=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("utf-8")
while info != 'bye': ##当消息不为bye是继续循环
if info: ##如果消息不为空
print('收到的信息是:'+info) ##输出输入的消息
send_data=input('请输入你要发送的信息:') ##服务器发送信息
send_data=str(send_data) ##转换为字符串
sock.send(send_data.encode()) ##编码并发送信息
if send_data=='bye': ##如果发送服务器信息为bye,则退出循环
break
info=sock.recv(1024).decode() ##接收客户端下一条信息
sock.close()
s.close()
上述代码具体含义
- import socket:导入socket模块
- host:指定服务器的ip地址
- port:指定服务器监听的端口号
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM):创建一个TCP客户端的socket,使用IPv4地址族和TCP协议
- s.bind((host,port)):绑定IP地址和端口号
- s.listen(1):设置监听最大连接数为1
- sock,addr=s.accept():接收客户端的连接 accept ##接受
- info=sock.recv(1024).decode("utf-8"):设置接收大小为1024,解码格式为utf-8
- sock.close():关闭客户端连接
- s.close():关闭服务器监听套接字
注意:在102客户端进行操作
[root@localhost ~]# vim tcppy.py
import socket
s=socket.socket()
host='192.168.10.101' ##要连接的服务器
port=12345
s.connect((host,port)) ##连接成功显示建立连接
print('已经建立连接')
info='' ##初始化接收的消息为空字符串
while info != 'bye': ##客户端输入bye退出连接
send_data=input('请输入你要发送的信息:') ##获取用户输入
send_data=str(send_data) ##转换为字符串
s.send(send_data.encode()) ##编码并发送消息
if send_data=='bye':
break
info=s.recv(1024).decode() ##接收服务器消息最多1024字节,并进行解码
print('接收到的信息是:'+info) ##输出接收的消息
s.close()
验证
[root@localhost ~]# python3 tcppy.py ##客户端发送
已经建立连接
请输入你要发送的信息:1
[root@localhost ~]# python3 tcp.py ##服务器接收,回应客户端
建立连接成功
收到的信息是:1
请输入你要发送的信息:
三,UDP编程
设计一个简单的TCP聊天应用,不仅如此我们还可以使用UDP编写一个简单的聊天应用,客户端发送信息,服务器接收并返回响应
注意:在105服务器进行操作
[root@localhost ~]# vim udp.py
import socket
host='192.168.10.105'
port=123
server_address = (host, 123)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
print(f"服务器已启动,监听地址: {server_address}")
while True:
data, client_address = sock.recvfrom(1024) ##接收客户端数据报
message = data.decode('utf-8') ##解码为字符串
if message.lower() == 'exit': ##如果客户端发送exit
print(f"客户端 {client_address} 已断开连接") ##则退出循环
break
print(f"客户端 {client_address}: {message}") ##打印客户端消息
# 发送消息到客户端
reply = input("服务器回复: ") ##获取用户输入
sock.sendto(reply.encode('utf-8'), client_address) ##编码并发送数据报
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM):使用IPv4协议,并使用UDP协议建立连接
- sock.bind(server_address):绑定地址和端口,开始监听数据报。
注意:在106客户端进行操作
[root@localhost ~]# vim udppc.py
import socket
host='192.168.10.105'
port=123
server_address = (host, port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("客户端已启动,输入'exit'退出聊天")
while True:
message = input("客户端发送: ") ##获取用户输入
sock.sendto(message.encode('utf-8'), server_address) ##编码并发送数据报到服务器
if message.lower() == 'exit': ##如果用户输入exit,则退出循环
break
data, server = sock.recvfrom(1024) ##接收服务器返回的数据报
print(f"服务器: {data.decode('utf-8')}") ##解码并打印服务器消息
sock.close()
验证
[root@localhost ~]# python3 udp.py
服务器已启动,监听地址: ('192.168.10.105', 123)
[root@localhost ~]# python3 udppc.py
客户端已启动,输入'exit'退出聊天
客户端发送: 1
[root@localhost ~]# python3 udp.py
服务器已启动,监听地址: ('192.168.10.105', 123)
客户端 ('192.168.10.106', 33446): 1
服务器回复:
四,TCP和UDP之间的区别
使用tcp验证,测试
[root@localhost ~]# python3 tcp.py ##运行tcp服务器脚本时未连接不会有任何响应
[root@localhost ~]# python3 tcppy.py ##直到客户端建立连接
已经建立连接
请输入你要发送的信息:
[root@localhost ~]# python3 tcp.py ##服务器才会响应
建立连接成功
使用udp验证,测试
[root@localhost ~]# python3 udp.py ##udp启动就开始监听地址,等待客户端发送信息
服务器已启动,监听地址: ('192.168.10.105', 123)
[root@localhost ~]# python3 udppc.py
客户端已启动,输入'exit'退出聊天
客户端发送:
主要区别:
TCP 需要显式建立和关闭连接
UDP 无需连接,但每次发送需指定目标地址