自学内容网 自学内容网

学习日志013--python简单网络编程

一、网络协议

为了保障在不同设备或系统中能够正确高效地通讯,网络协议由此诞生。人们根据最常用的两个协议TCP/IP来代指所有的网络协议。

二、TCP与UDP

简单来说TCP协议是一种考虑比较全面的协议,拥有复杂且多样的机制保障传输内容精确无误从一端传到另一端,但也因此需求高质量的网络来传输大量的数据(除数据本身外还有为保障数据可靠性等方面而产生的大量头部开销),因此常用作网页等相对稳定且数据量较少的场景。

UDP与TCP相反,UDP协议则是一个简单的面向数据报的协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。因此在直播等邻域颇有成就。

三、在python编辑环境中运用TCP与UDP

网络编程中我们将用到socket函数库,他包含着多种协议的方法供我们使用。由于传输需要发送方与接收方,这里我们以两个进程作为代替。

TCP

服务端

import  socket
import threading

# 创建嵌套字对象,AF_INET是关于IPv4网络协议的嵌套字,SOCK_STREAM使用TCP的main相连接
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#将地址和端口以元组大形式绑定
server_address = ('localhost',2468)
server_socket.bind(server_address)

"""
监听链接
listen 开始TCP监听。backlog指定在拒绝链接之前,
操作系统可以挂起的最大链接数量
该值最少为1.
"""
server_socket.listen(5)
print("等待连接中")

# accept()返回链接到的对象和其地址
client_socket , client_address = server_socket.accept()
print(f"链接{client_address}")

def send():
    while True:
        msg = input()
        # 将文本转化为机器能识别的二进制语言
        client_socket.send(msg.encode())


def get():
    while True:
        data = client_socket.recv(1024)
        print(f"收到{data.decode()}")

if __name__ == '__main__':
    t1 = threading.Thread(target=get)
    t2 = threading.Thread(target=send)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

客户端

import socket
import threading

# 创建嵌套字对象,AF_INET是关于IPv4网络协议的嵌套字,SOCK_STREAM使用TCP的main相连接
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 链接服务器
server_address = ('localhost', 2468)
client_socket.connect(server_address)



def send():
    while True:
        msg = input()
        # 将文本转化为机器能识别的二进制语言
        client_socket.send(msg.encode())


def get():
    while True:
        data = client_socket.recv(1024)
        print(f"收到{data.decode()}")


if __name__ == '__main__':
    t1 = threading.Thread(target=get)
    t2 = threading.Thread(target=send)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

UDP

服务端

import socket
import threading

udp_c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)



def send():
    msg = 10
    while True:

        # msg = input('客户端:')
        msg += 10
        msg = str(msg)
        # 发送消息
        udp_c.sendto(msg.encode(),('192.168.60.60',7777))
        msg = int(msg)
        print("数据已发送")

if __name__ == '__main__':
    t1 = threading.Thread(target=send)
    t1.start()
    t1.join()

客户端

import socket
import threading

udp_s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 绑定端口号
udp_s.bind(('192.168.60.60',7777))

# 等待连接数据
print("等待连接数据")
def get():
    while True:
        # 返回一个元组,数据,地址
        data,UDP_c_addr = udp_s.recvfrom(1024)

        print(f"接收到来自{UDP_c_addr}的消息{data.decode()}")

if __name__ == '__main__':
    t1 = threading.Thread(target=get)
    t1.start()
    t1.join()

四、json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。因此,不同编辑之间需要他来当桥梁。

python语言也支持与json转化

import json

d1 = {'name':'张三','age':18,'score':97.5}

with open("./data.json",'w') as f:

    f.write(json.dumps(d1))

with open("./data.json",'r') as f:
    text = f.read()
    py_data = json.loads(text)
    print(py_data)
    print(type(py_data))

五、mqtt协议

MQTT采用发布/订阅模型,消息发布者不直接将消息发送给订阅者,而是发送到MQTT代理(Broker)。订阅者向Broker订阅特定主题的消息,Broker负责将消息推送给所有订阅了该主题的订阅者。


import time
import paho.mqtt.client as mqtt

broker = 'broker.emqx.io'   # mqtt代理服务器地址
port = 1883                 # 端口号
pub_topic = "菠萝"      # 消息主题

def on_connect(client, userdata, flags, rc):
    """
    判断MQTT连接是否成功
    :param client: MQTT client实例
    :param userdata: 用户自定义数据,可用于传递额外的用户定义数据到回调函数中。
    :param flags: 连接标志,包含有关连接的一些信息。
    :param rc: 连接结果码
    :return: None
    """
    if rc == 0:
        # 连接成功,输出提示信息
        print("连接成功!")
    else:
        # 连接失败,输出提示信息
        print(f"连接失败, return code {rc}")

# 连接mqtt
client = mqtt.Client()

# 将on_connect回调函数关联到client对象
client.on_connect = on_connect

# 连接mqtt服务器
client.connect(broker, port)

# 启动MQTT客户端的循环处理
client.loop_start()

# 等待连接成功
time.sleep(1)

i = 0
while True:
    # 发送的数据 这是来自发布者的消息
    data = f'番茄火锅-{str(i)}'
    print(f'消息已发送:{data}')
    client.publish(pub_topic, payload=data, qos=0)
    # 做一个发送延时
    time.sleep(3)
    i += 1
# 导入相关库
import time
import paho.mqtt.client as mqtt

broker = 'broker.emqx.io'  # mqtt代理服务器地址
port = 1883
sub_topic = "菠萝"  # 订阅消息主题

def on_connect(client, userdata, flags, rc):
    """
    判断MQTT连接是否成功
    :param client: MQTT client实例
    :param userdata: 用户自定义数据,可用于传递额外的用户定义数据到回调函数中。
    :param flags: 连接标志,包含有关连接的一些信息。
    :param rc: 连接结果码
    :return: None
    """
    if rc == 0:
        # 连接成功,输出提示信息
        print("Connected to MQTT OK!")
    else:
        # 连接失败,输出提示信息
        print(f"Failed to connect, return code {rc}")

def on_message(client, userdata, msg):
    """
    用于处理接收到的消息
    client、userdata作用与on_connect回调函数作用一样,这里不过多叙述
    我们着重讲解一下msg参数:一个包含有关接收到的消息的对象
    - msg.topic:消息的主题,是一个字符串。
    - msg.payload:消息的内容,是一个字节数组(bytes)。
    - msg.qos:消息的服务质量等级(Quality of Service)。
    - msg.retain:表示消息是否为保留消息,是一个布尔值。
    """
    print(f"接收到的消息:{msg.payload.decode()} 来自topic: {msg.topic} qos等级:{msg.qos}")

# 连接mqtt
client = mqtt.Client()

# 将on_connect回调函数关联到client对象
client.on_connect = on_connect

# 将on_message回调函数关联到client对象
client.on_message = on_message

# 连接mqtt服务器
client.connect(broker, port)

# 启动MQTT客户端的循环处理
client.loop_start()

# 等待连接成功
time.sleep(1)

# 订阅topic
client.subscribe(sub_topic, qos=0)

while True:
    # 在循环中处理消息
    time.sleep(1)


原文地址:https://blog.csdn.net/Z211613347/article/details/143890452

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!