You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求教:树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:40:16