学习日志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)!