📄 pythonutil.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 + -