温馨提示×

CentOS Python与Java如何交互

小樊
57
2026-01-06 07:29:47
栏目: 编程语言

在CentOS系统上,Python和Java可以通过多种方式实现交互。以下是一些常见的方法:

1. 使用HTTP REST API

  • Python端:创建一个RESTful API服务器,使用Flask或Django等框架。
  • Java端:使用HttpClient或其他HTTP客户端库发送请求到Python服务器。

Python示例(使用Flask):

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/api/data', methods=['GET'])
def get_data():
    return jsonify({"message": "Hello from Python!"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Java示例(使用HttpClient):

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("http://localhost:5000/api/data");
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                System.out.println(EntityUtils.toString(response.getEntity()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 使用消息队列

  • Python端:使用RabbitMQ、Kafka等消息队列发送消息。
  • Java端:使用相应的消息队列客户端库接收和处理消息。

Python示例(使用RabbitMQ):

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello from Python!')
print(" [x] Sent 'Hello from Python!'")

connection.close()

Java示例(使用RabbitMQ):

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQExample {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello from Java!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

3. 使用JNI(Java Native Interface)

  • Python端:编写C/C++代码并通过JNI与Java交互。
  • Java端:使用JNI调用本地方法。

这种方法较为复杂,通常用于性能敏感的场景。

4. 使用Socket通信

  • Python端:创建一个TCP或UDP服务器。
  • Java端:使用Socket客户端连接到Python服务器。

Python示例(TCP服务器):

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)

while True:
    client_socket, addr = server_socket.accept()
    print(f"Connection from {addr}")
    client_socket.sendall(b"Hello from Python!")
    client_socket.close()

Java示例(TCP客户端):

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class TCPClientExample {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 12345);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String response = in.readLine();
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

选择哪种方法取决于具体的需求和场景。HTTP REST API是最简单和最常用的方法,适用于大多数情况。消息队列适用于需要异步处理和解耦的场景。JNI适用于性能敏感的场景,但实现复杂。Socket通信适用于需要实时双向通信的场景。

0 踩