新手求教:树莓派Python Socket监听器如何读取JSON数据
嘿,作为Python新手能在树莓派上折腾Socket监听器已经很棒啦!要让它能读取JSON数据,其实只需要在现有代码基础上加上数据接收和JSON解析的逻辑就行,我给你详细拆解:
实现Socket监听器读取JSON数据的完整方案
首先,你需要导入Python自带的json模块(不用额外安装,直接用就行),然后在监听循环里处理客户端的连接、数据接收和JSON解析。下面是修改后的完整代码,我还帮你把原来的Python2语法改成了树莓派现在默认的Python3写法:
import socket import sys import json # 导入JSON解析模块 # 配置监听地址和端口,根据你的需求修改 HOST = '' # 空字符串表示监听所有可用的网络接口 PORT = 12345 # 创建Socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print('Socket created') # 绑定地址和端口 try: s.bind((HOST, PORT)) except socket.error as msg: print(f'Bind failed. Error Code : {msg[0]} Message {msg[1]}') sys.exit() print('Socket bind complete') s.listen(10) print('Socket now listening') # 循环接受客户端连接 while True: # 等待客户端连接 conn, addr = s.accept() print(f'Connected with {addr[0]}:{addr[1]}') # 读取客户端发送的数据(这里先假设数据一次性发送完成,缓冲区大小可根据需求调整) received_data = conn.recv(1024) if not received_data: break # 解析JSON数据的逻辑 try: # 把字节数据解码成UTF-8字符串,再解析为JSON对象 json_data = json.loads(received_data.decode('utf-8')) print('Successfully parsed JSON data:') print(json_data) # 这里可以添加你自己的业务逻辑,比如提取JSON里的字段 # 示例:如果JSON包含"message"字段,就打印出来 if 'message' in json_data: print(f'Received message: {json_data["message"]}') except json.JSONDecodeError as e: print(f'Failed to parse JSON: {str(e)}') except UnicodeDecodeError as e: print(f'Failed to decode data (make sure it\'s UTF-8 encoded): {str(e)}') # 可选:给客户端返回接收确认 conn.sendall(b'JSON data received successfully!') # 关闭当前连接 conn.close() # 关闭监听Socket(实际运行中这里可能不会执行,因为上面是无限循环) s.close()
几个关键注意事项
- Python版本兼容:你原来的代码是Python2的语法(比如
print 'xxx'、except socket.error , msg),现在树莓派默认使用Python3,所以我改成了Python3的写法,运行的时候记得用python3 your_script.py哦。 - 数据完整性处理:如果你的C#客户端发送的JSON数据很大(超过1024字节),上面的
recv(1024)只能读到一部分数据,这时候需要循环读取直到拿到完整的JSON。比如可以约定客户端在发送JSON前先发送数据长度,或者用特殊字符(比如\n)标记JSON结束。举个简单的循环读取例子:
# 替换原来的received_data = conn.recv(1024) received_data = b'' while True: chunk = conn.recv(1024) if not chunk: break received_data += chunk # 假设客户端发送完JSON后会加一个换行符 if b'\n' in chunk: break
- C#客户端配合:确保你的C#客户端发送的是UTF-8编码的JSON字符串,比如用Newtonsoft.Json序列化并发送的示例代码:
using System; using System.Net.Sockets; using System.Text; using Newtonsoft.Json; class TcpJsonClient { static void Main() { // 替换成你的树莓派IP地址 string raspberryPiIp = "192.168.1.100"; int port = 12345; using (TcpClient client = new TcpClient(raspberryPiIp, port)) using (NetworkStream stream = client.GetStream()) { // 构造要发送的对象 var payload = new { device = "Raspberry Pi", message = "Hello from C# client!", value = 123 }; // 序列化为JSON字符串 string jsonString = JsonConvert.SerializeObject(payload); // 转换为UTF-8字节数组 byte[] buffer = Encoding.UTF8.GetBytes(jsonString); // 发送数据 stream.Write(buffer, 0, buffer.Length); Console.WriteLine("JSON data sent successfully!"); } } }
内容的提问来源于stack exchange,提问作者Marnus Steyn
相关产品推荐
相关产品推荐

