Python语言提供了Socket套接字来实现网络通信,Python的应用程序通常通过Socket"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯!

网络:就是指将具有独立功能的多台计算机通过通信线路连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。通俗理解网络就是把双方或者多方设备连接起来的一个工具,然后可以进行数据传递。

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

TCP协议:

  1. TCP协议是在通信的两台设备之间建立连接通道,对传输的数据大小没有限制,但是因为建立了连接,相对可靠一些,但是速度会慢一些。TCP协议又称为三次握手–四次挥手协议,因为建立过程有三步(发送请求、获取反馈、建立连接)。通常情况下,我们的蓝牙通信、打电话都是使用的 TCP 协议。
  2. 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协议:

  1. UDP协议需要将数据打包,因为包有大小,所以对数据大小是有限制的,UDP是不用建立连接的,但不保证待接收方一定会接收到消息,所以不可靠。但是,因为不用建立连接,因此速度要快一些。通常情况下,我们发送短信都是使用的UDP 协议。
  2. 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源代码就可以进行简单的通讯