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

Java调用树莓派Python Flask服务并接收处理返回响应的技术咨询

修复方案

1. Python侧调整

你的现有Python代码存在3个核心问题会影响响应返回,需要先修复:

  • 路由注册顺序错误:所有@app.route装饰的路由函数必须放在app.run()之前,否则服务启动后路由不会被注册,访问会返回404
  • 默认监听地址限制:app.run()默认只监听本地127.0.0.1,其他设备无法访问,需要修改为监听所有网卡
  • 串口资源未释放:串口打开使用后需要及时关闭,避免端口占用导致后续请求失败

修复后代码示例:

import serial
import time
from flask import Flask, redirect, jsonify, url_for

app = Flask(__name__)

# 所有路由定义放在app.run()前面
@app.route('/light/on')
def lights_on():
    serialComs(b"on\n")
    line = serialComs(b"status\n")
    # 可选优化:直接返回JSON取消跳转,Java侧处理更简单
    # return jsonify({'status': line})
    return redirect('/' + line)


@app.route("/light/off")
def lights_off():
    serialComs(b"off\n")
    line = serialComs(b"status\n")
    # return jsonify({'status': line})
    return redirect('/' + line)


@app.route("/light/status")
def light_status():
    status = serialComs(b"status\n")
    if status == "":
        status = "unknown"
    return jsonify({'status': status})


@app.route("/<lightstatus>")
def lights(lightstatus):
    print(lightstatus)
    return jsonify({'status': lightstatus})


def serialComs(state):
    ser = serial.Serial('/dev/ttyAMA0',9600 , timeout=1)
    ser.flush()
    ser.write(state)
    time.sleep(0.5)
    line = ser.readline().decode('utf-8').rstrip()
    ser.close() # 用完关闭串口,避免资源占用
    return line

if __name__ == '__main__':
    app.debug = True
    # 监听所有网卡地址,允许其他设备访问
    app.run(host='0.0.0.0')

2. Java侧调整

你的现有Java代码只发起了请求,没有读取响应流的内容,同时缺少重定向适配、超时配置,修复后代码示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

// 方法返回值可根据业务需要改为自定义对象
public String doSwitch(String urlString) {
    URL url = null;
    HttpURLConnection con = null;
    BufferedReader reader = null;
    StringBuilder response = new StringBuilder();
    try {
        url = new URL(urlString);
        con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("Accept", "application/json");
        // 开启自动跟随重定向,适配现有Python侧的跳转逻辑
        con.setInstanceFollowRedirects(true);
        // 配置超时,避免无限制等待挂起服务
        con.setConnectTimeout(5000);
        con.setReadTimeout(10000);

        // 读取响应流内容
        reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        // 此处response.toString()就是Python返回的JSON字符串
        // 后续可接入Jackson、Fastjson等JSON工具解析为Java对象,提取status字段
        return response.toString();
    } catch (IOException e) {
        log.error(String.format("An error occurred: %s", e));
        throw new ConnectionFailedException("An error occurred", e);
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            log.error("流关闭失败", e);
        }
        if (con != null) {
            con.disconnect();
        }
    }
}

3. 学习参考要点

  • Java HttpURLConnection核心配置:重点掌握超时设置、重定向处理、响应流读取逻辑
  • Java JSON工具使用:常用的Jackson、Fastjson均可,用来将返回的JSON字符串解析为Java对象,提取需要的业务字段
  • Flask服务配置:路由注册规则、服务监听地址配置、响应格式设置
  • 串口操作注意事项:打开使用后及时关闭,避免端口占用导致后续请求失败

内容的提问来源于stack exchange,提问作者Christiaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:45:06