⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pythonutil.java

📁 在java中执行python脚本的实际接口代码
💻 JAVA
字号:
/**
 * 
 */
package com.coretek.tools.j2me.coral.python;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 
 * @author Lasly
 * 
 */
public class PythonUtil {

	/**
	 * 服务端端口号
	 */
	private static int PORT = 8883;
	
	/**
	 * 记录python的执行路径
	 */
	private static String pythonPath = "";

	/**
	 * @return 返回 process。
	 */
	public static Process getProcess() {
		return process;
	}

	/**
	 * @param process 要设置的 process。
	 */
	public static void setProcess(Process process) {
		PythonUtil.process = process;
	}

	/**
	 * 设置运行语句
	 */
	private static String getRunString(String str){
		return pythonPath + "/python.exe " + pythonPath + "/" + str;
	}

	/**
	 * 启动后台程序的标识
	 */
	private static Process process = null;
	
	/**
	 * 保存上一次的文件数据
	 */
	private static String[] lastTmpFiles;
	
	/**
	 * 同步方式执行python语句,并且返回数据流表示执行情况
	 * 
	 * @param fd
	 *            链接的客户端句柄
	 * @param pythonString
	 *            需要执行的python数据流
	 * @param output
	 *            返回输出截屏列表
	 */
	public synchronized static String[] runPythonString(int fd, String pythonString,
			OutputStream output) {
		if( process == null ){
			return null;
		}
		if( lastTmpFiles != null ){
			for( int i = 0 ; i < lastTmpFiles.length ; i++ ){
				File file = new File(lastTmpFiles[i]);
				file.delete();
			}
			lastTmpFiles = null;
		}
		ConnectData connectData = ConnectData.getConnectData(fd);
		if( connectData == null ){
			return null;
		}
		String runString = "setInit(" + String.valueOf(connectData.connectId)+ ",\"" + pythonPath + "/tmp\",0)\n"+pythonString;
		try {
			connectData.consoleSimulator.setOutputStream(output);
			connectData.tIn = new Thread(connectData.consoleSimulator);
			connectData.tIn.start();
			byte[] src = runString.getBytes("UTF-8");
			byte[] size = new byte[10];
			byte[] sizeSrc = String.valueOf(src.length).getBytes("UTF-8");
			System.arraycopy(sizeSrc , 0 , size , 0 , sizeSrc.length);
			connectData.dataOutputStream.write(size);
			connectData.dataOutputStream.write(src);
			try {
				connectData.tIn.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String[] ret = new String[connectData.consoleSimulator.getPicCount()];
			for( int i = 0 ; i < connectData.consoleSimulator.getPicCount() ; i++ ){
				ret[i] = pythonPath + "/tmp" + ( i + 1 ) + ".png";
			}
			lastTmpFiles = ret;
			return ret;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 通过连接字符串连接目标机
	 * 
	 * @param connectString
	 *            连接字符串
	 * @return 链接后的整数值标识,为-1时表示连接失败
	 */
	public static int connectMachine(String connectString) {
		if( process == null ){
			try {
				process = Runtime.getRuntime().exec(getRunString("StartRemoteServer.py"));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
		
		ConnectData connectData = new ConnectData();
		try {
			connectData.soc= new Socket("127.0.0.1" ,PORT);
			connectData.consoleSimulator = new ConsoleSimulator(connectData.soc.getInputStream(), byteArrayOutputStream);
			connectData.tIn = new Thread(connectData.consoleSimulator);
			connectData.dataOutputStream = new DataOutputStream(connectData.soc.getOutputStream());
		} catch (Exception e) {
			e.printStackTrace();
			ConnectData.removeConnectData(connectData.getFD());
			return -1;
		}
		// TODO Getdata
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512);
		if( runPythonString( connectData.getFD() , "print startMonitor(\""+ connectString + "\")", outputStream) == null ){
			ConnectData.removeConnectData(connectData.getFD());
			return -1;
		}
		String temp = new String(outputStream.toByteArray()).trim();
		if(temp.length()==0){
			temp = "-1";
		}
		connectData.connectId = Integer.parseInt(temp);
		if( connectData.connectId == -1 ){
			ConnectData.removeConnectData(connectData.getFD());
			return -1;
		}
		return connectData.getFD();
	}

	/**
	 * 断开和目标机的链接
	 * 
	 * @param id
	 *            需要断开的目标机链接标识
	 */
	public static void disConnectMacine(int fd) {
		ConnectData connectData = ConnectData.getConnectData(fd);
		if( connectData == null ){
			return;
		}
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512);
		runPythonString( connectData.getFD() , "shutdownMonitor("+ String.valueOf(connectData.connectId) + ")", outputStream);
		ConnectData.removeConnectData(connectData.getFD());
		try {
			connectData.soc.close();
		} catch (IOException e) {
		}
		if( ConnectData.isEmpty() ){
			process.destroy();
			process = null;
		}
	}

	/**
	 * 设置python的执行路径
	 * 
	 * @param path
	 *            python路径
	 */
	public static void setPath(String path) {
		pythonPath = path;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -