Python语言提供了Socket套接字来实现网络通信,Python的应用程序通常通过Socket"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯!
网络:就是指将具有独立功能的多台计算机通过通信线路连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。通俗理解网络就是把双方或者多方设备连接起来的一个工具,然后可以进行数据传递。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
TCP协议:
- TCP协议是在通信的两台设备之间建立连接通道,对传输的数据大小没有限制,但是因为建立了连接,相对可靠一些,但是速度会慢一些。TCP协议又称为三次握手–四次挥手协议,因为建立过程有三步(发送请求、获取反馈、建立连接)。通常情况下,我们的蓝牙通信、打电话都是使用的 TCP 协议。
- TCP:英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议(在通信传输之前,先打开一个连接。连接被关闭时无法发送数据。)
TCP特点:
1. 面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。双方间的数据传输都可以通过这一个连接进行。完成数据交换后,双方必须断开此连接,以释放系统资源。这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2. 可靠传输
2.1 TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2.2 超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
2.3 错误校验
由发送端计算,然后由接收端验证,其目的是为了检测数据在发送端到接收端之间是否有改动,如果接收方检测到校验和有差错,则直接丢弃这个数据包。
2.4 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
TCP的优缺点:
①优点:
可靠,稳定
适合传输大量数据
②缺点:
传输速度慢
占用系统资源高
UPD协议:
- UDP协议需要将数据打包,因为包有大小,所以对数据大小是有限制的,UDP是不用建立连接的,但不保证待接收方一定会接收到消息,所以不可靠。但是,因为不用建立连接,因此速度要快一些。通常情况下,我们发送短信都是使用的UDP 协议。
- UDP:英文全拼(User Datagram Protocol)简称用户数据报协议,它是无连接的、不可靠的网络传输协议(无需确认对端是否存在,发送端可随时发送数据。)
UDP特点:
因为udp发送数据之前不需要建立连接所有具有以下特点:
1.无连接
2.资源开销小
3.传输速度快
4.udp每个数据包最大是64K
UDP的优缺点:
①优点:
传输速度快
不需要连接,资源开销小
②缺点:
传输数据不可靠,容易丢数据包
没有流量控制,当对方没有及时接收数据,发送方一直发送数据会导致缓冲区数据满了,电脑出现卡死情况,所有接收方需要及时接收数据。
TCP和UDP区别:
TCP面向连接; UDP是不面向连接;
TCP提供可靠的数据传输,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP不保证可靠的数据传输,容易出现丢包情况;
TCP需要连接传输速度慢,UDP不需要连接传输速度快
TCP不支持发广播;UDP支持发广播
TCP对系统资源要求较多,UDP对系统资源要求较少。
TCP适合发送大量数据,UDP适合发送少量数据
TCP有流量控制,UDP没有流量控制
**
TCP服务器客户端—>源代码
**
TCP_Server服务器:
# -*- coding: utf-8 -*-
# @Time : 2022/12/5 17:56
# @Author : 微酷
# @Email : 110169011@qq.com
# @Filename : TCP_Server服务器.py
# @Software : PyCharmPro2021.3; Anaconda(Python3.10)
# 使用python中的网络编程
import socket
import time
# 创建一个tcp/ip协议的套接字
tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 创建一个udp/ip的套接字
# udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#IP/端口号
host = "localhost"
port = 8888
Address = (host,port)
# 开始绑定地址
tcpSocket.bind(Address)
tcpSocket.listen(5)
while True:
print("-"*15,"服务器等待被连接","-"*15)
client_sock,client_add = tcpSocket.accept()
print("已连接到客户端,地址为:{0}".format(client_add))
try:
print("*"*20,"正在等待接收数据ing","*"*20)
while True:
#接收客户端向服务器发送的数据
Client_databack = client_sock.recv(1024)
print("接收到的客户端发送数据内容为:{0}".format(str(Client_databack,encoding="UTF-8")))
if Client_databack.upper() == "EXIT":
break
# # 获取电脑当前时间,带日期的24小时格式 %I:12小时制 %H:24小时制
Now_time = time.strftime("%Y/%m/%d %H:%M:%S",time.localtime())
# 服务器向客户端的响应数据
#client_sock.send(bytes(data.encode("UTF-8")))
client_sock.send(bytes("时间 = {0},数据 = {1}".format(Now_time, str(Client_databack, encoding="UTF-8")), encoding="UTF-8"))
Server_data = input("My[服务器]=====>请输入发送到客户端的消息 :")
client_sock.send(Server_data.encode("UTF-8"))
#接收客户端向服务器发送的数据
Server_databack = client_sock.recv(1024).decode("UTF-8")
print("接收到的客户端发送数据内容为:%s" % Server_databack)
except Exception as abc:
print(abc)
finally:
client_sock.close()
TCP_Client客户端
# -*- coding: utf-8 -*-
# @Time : 2022/12/5 17:45
# @Author : 微酷
# @Email : 110169011@qq.com
# @Filename : TCP_Client客户端.py
# @Software : PyCharmPro2021.3; Anaconda(Python3.10)
# 使用python中的网络编程
import socket
import time
# 创建一个tcp/ip协议的套接字
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建一个udp/ip的套接字
# udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#IP/端口号
host = "localhost
port = 8888
Address = (host, port)
# 开始连接服务器地址
clientSocket.connect(Address)
if clientSocket is None:
print("Sorry,无法未连接到服务器.....NO")
else:
print("Successful,已经连接到服务器-----OK")
while True:
Client_data = input("My[客户端]=====>请输入发送到服务器的消息(exit/quit退出) :")
#time.sleep(0.5)
if Client_data.lower() =="exit" or Client_data.lower() =="quit":
#bytes 字节串
clientSocket.send(bytes("EXIT".encode("UTF-8")))
#关闭当前客户端
print("我断开连接了...")
clientSocket.close()
break
clientSocket.send(bytes(Client_data.encode("UTF-8")))
#接收服务器向客户端发送的数据
Client_data_finally = clientSocket.recv(1024).decode("UTF-8")
print("【系统反馈】已收到数据内容为:%s"%Client_data_finally)
#print("收到的客户端数据内容为:{0}".format(str(data_finally)))
UDP服务器客户端—>源代码
UDP_Server服务器:
# -*- coding: utf-8 -*-
# @Time : 2022/12/5 18:10
# @Author : 微酷
# @Email : 110169011@qq.com
# @Filename : UDP_Server服务器.py
# @Software : PyCharmPro2021.3; Anaconda(Python3.10)
import socket
HOST = ''
PORT = 10888
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((HOST, PORT))
data = True
while data:
data,address = s.recvfrom(2048)
if data == b'bye':
break
print('Received String:',data.decode('utf-8'))
s.sendto(data,address)
s.close()
UDP_Client客户端:
# -*- coding: utf-8 -*-
# @Time : 2022/12/5 18:18
# @Author : 微酷
# @Email : 110169011@qq.com
# @Filename : UDP_Client客户端.py
# @Software : PyCharmPro2021.3; Anaconda(Python3.10)
import socket
HOST = 'localhost'
PORT = 10888
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = '你好!'
while data:
s.sendto(data.encode('utf-8'),(HOST,PORT))
if data == 'bye':
break
data, addr = s.recvfrom(512)
print('Recv from server:\n',data.decode('utf-8'))
data = input('Please input a info:\n')
s.close()
这两份TCP与UDP源代码就可以进行简单的通讯