package com.linkage.interfaces.webservice; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.net.SocketException; import java.util.ArrayList; import java.util.List; import org.apache.commons.net.telnet.TelnetClient; import com.jcraft.jsch.JSchException; import com.linkage.interfaces.webservice.factory.SSHProtocol; /** * Telnet Util * @version 20140410 v.2 */ public class TelnetSample implements Runnable{ private InputStream in; private PrintStream out; private char prompt = '$'; private String server; private String user; private String password; private String command; private String directory; private int port; /** * Overloaded constructor * @param server * @param user * @param password */ public TelnetSample(String server, String user, String password,String directory,String command,Integer port){ this.server = server; this.port = port; this.user = user; this.password = password; this.command = command; this.directory = directory; } /** * Enable thread */ private String curLoginUser = null; /*account Attributes*/ private List<String> iniGrp = new ArrayList<String>(); private SSHProtocol sp; public void run() { login(server,user,password); execCommond(directory,command); } public void login(String server,String username,String password) { sp = new SSHProtocol(server,22); curLoginUser = username; try { sp.connect(username, password); } catch (Exception e) { e.printStackTrace(); } } int status = -1; public boolean execCommond(String directory,String command ){ StringBuffer sb = new StringBuffer(); String cmd="chmod +x "+directory+"/"+command; try { status = sp.execCommand(cmd, sb); if(status==0){ cmd="sh "+directory+"/"+command; status = sp.execCommand(cmd, sb); if(status!=0){ return false; } }else{ return false; } } catch (JSchException e) { e.printStackTrace(); }finally{ this.logout(); } return true; } public void logout(){ if(sp != null) sp.disconnect(); } public boolean isLogin(){ if(sp == null) return false; return sp.isConnected(); } // /** // * test // * @param args // */ public static void main(String[] args) { /*System.out.println(Thread.currentThread().getName() + " 线程运行开始!"); TelnetSample tu1 = new TelnetSample("111.11.1.11", "aaaa", "11111","cd /s1/wxs/sale/businese/program", "./sale_bi.sh /ngbss1/wxwlbss/sale/stock_businese/program/upload/20100521024732.txt 8989 3"); TelnetSample tu2 = new TelnetSample("10.100.10.100", "aaaa", "11111","cd /businese/program", "./sale_bi.sh /ngbss/sale/stock_businese/upload_stock/2010.txt 832 3"); Thread thread1 = new Thread(tu1); thread1.start(); Thread thread2 = new Thread(tu2); thread2.start(); System.out.println(Thread.currentThread().getName() + " 线程运行结束!");*/ TelnetSample tu3 = new TelnetSample("199.199.19.29", "root", "123456","/bss/web/domains/ww_domain", "ShellFtp2014.sh",22); Thread thread1 = new Thread(tu3); thread1.start(); } }
SSHProtocol .java类
package com.linkage.maitain.factory; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.Iterator; import java.util.StringTokenizer; import java.util.Vector; import org.apache.log4j.Logger; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.UserInfo; public class SSHProtocol { private static final Logger LOGGER = Logger.getLogger(SSHProtocol.class); public static final UserInfo defaultUserInfo = new UserInfo() { public String getPassphrase() { return null; } public String getPassword() { return null; } public boolean promptPassword(String arg0) { return false; } public boolean promptPassphrase(String arg0) { return false; } public boolean promptYesNo(String arg0) { return true; } public void showMessage(String arg0) { } }; JSch jsch = null; String host; String user; int port = 22; String password; int timeout = 15 * 1000; public static final String RETR_STR = "\n"; private Session session = null; public SSHProtocol(String host, int port, String user, String password) { jsch = new JSch(); this.host = host; this.port = port; this.user = user; this.password = password; } public SSHProtocol(String host, String user, String password) { jsch = new JSch(); this.host = host; this.user = user; this.password = password; } public SSHProtocol(String host, int port) { jsch = new JSch(); this.host = host; this.port = port; } public void setLoginUser(String user, String password) { this.user = user; this.password = password; } public int execCommand(String command, StringBuffer sb) throws JSchException { Channel channel = null; // String result = null; int i; int status = -1; if (command == null || !isConnected()) { return -1; } try { channel = session.openChannel("exec"); // ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err, true); // InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[2048]; while (true) { while (in.available() > 0) { i = in.read(tmp, 0, 1024); if (i < 0) { break; } result = new String(tmp, 0, i, "utf-8"); sb.append(result); } if (channel.isClosed()) { status = channel.getExitStatus(); // System.out.println("exit-status: "+status); break; } try { Thread.sleep(200); } catch (Exception ee) { } } channel.disconnect(); } catch (JSchException e) { e.printStackTrace(); throw e; } catch (IOException ex) { ex.printStackTrace(); } return status; } public String execShell(String[] commands, String[] resps, boolean fetch) throws JSchException { Channel channel = null; StringBuffer result = new StringBuffer(); String tmp; int i; boolean execOk = false; if (commands == null || resps == null) { throw new JSchException("Empty commands or responses to ssh."); } else if (commands.length != resps.length) { throw new JSchException( "Commands and responses length not equal to command."); } if (!isConnected()) { throw new JSchException("has not connect to server"); } try { channel = session.openChannel("shell"); PipedInputStream pins = new PipedInputStream(); PipedOutputStream pouts = new PipedOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(2048); channel.setInputStream(pins); channel.setOutputStream(out); pouts.connect(pins); channel.connect(); try { Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } for (i = 0; i < commands.length; i++) { if (!commands[i].endsWith(RETR_STR)) { commands[i] += RETR_STR; } pouts.write(commands[i].getBytes()); LOGGER.debug("--------------- commands: "+commands[i]); try { Thread.sleep(2000); } catch (Exception ex) { ex.printStackTrace(); } tmp = out.toString("utf-8"); LOGGER.debug("--------------- resp: "+resps[i]); LOGGER.debug("--------------- return: "+tmp); execOk = isGetSuccessReturn(tmp, resps[i]); if (i == commands.length - 1 && fetch) {// result.append(tmp); } if (execOk && i < commands.length - 1) {// out.reset(); } if (!execOk) { // one command timeout ,then ignore the others throw new JSchException("command " + commands[i] + " execute fails, other commands ignored."); } } channel.disconnect(); return result.toString(); } catch (JSchException e) { e.printStackTrace(); throw e; } catch (Exception e) { e.printStackTrace(); throw new JSchException(e.getMessage()); } } public String execShell(String[] commands, String[] resps, boolean fetch, ShellChannelWrapper shellChannelWrapper) throws JSchException { StringBuffer result = new StringBuffer(); boolean newShellChannel = null == shellChannelWrapper.getShellChannel(); if (null == commands || null == resps) { throw new JSchException("Empty commands or responses to ssh."); } else if (commands.length != resps.length) { throw new JSchException( "Commands and responses length not equal to command."); } if (!isConnected()) { throw new JSchException("has not connect to server"); } try { if (newShellChannel) { shellChannelWrapper.createNewShellChannel(session); } try { Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } shellChannelWrapper.getOut().reset(); for (int i = 0; i < commands.length; i++) { if (!commands[i].endsWith(RETR_STR)) { commands[i] += RETR_STR; } shellChannelWrapper.getPouts().write(commands[i].getBytes()); try { Thread.sleep(2000); } catch (Exception ex) { ex.printStackTrace(); } String tmp = shellChannelWrapper.getOut().toString("utf-8"); boolean execOk = isGetSuccessReturn(tmp, resps[i]); if (i == commands.length - 1 && fetch) {// result.append(tmp); } if (execOk && i < commands.length - 1) {// shellChannelWrapper.getOut().reset(); } if (!execOk) { // one command timeout ,then ignore the others throw new JSchException("command " + commands[i] + " execute fails, other commands ignored."); } } return result.toString(); } catch (JSchException e) { e.printStackTrace(); throw e; } catch (Exception e) { e.printStackTrace(); throw new JSchException(e.getMessage()); } } public String execShellToPrompt(String command, String osprompt, ShellChannelWrapper shellChannelWrapper) throws JSchException { String[] commands = { command }; String[] responses = { osprompt }; String result = execShell(commands, responses, true, shellChannelWrapper); int pos1 = result.lastIndexOf(command); if (pos1 == -1) { pos1 = 0; } else { pos1 = pos1 + command.length(); } result = getActualReqult(result, osprompt, pos1); return result; } public int execCommand(String host, int port, String user, String password, String command, StringBuffer sb) throws JSchException { JSch jsch = new JSch(); String result = null; int i; int status = -1; if (command == null) { return -1; } try { Session session = jsch.getSession(user, host, port); session.setPassword(password); session.setUserInfo(defaultUserInfo); // session.setTimeout(timeout); session.connect(); Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); LOGGER.debug("................"+command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err, true); InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[2048]; while (true) { while (in.available() > 0) { i = in.read(tmp, 0, 1024); if (i < 0) { break; } result = new String(tmp, 0, i, "utf-8"); sb.append(result); } if (channel.isClosed()) { status = channel.getExitStatus(); // System.out.println("exit-status: "+status); break; } try { Thread.sleep(200); } catch (Exception ee) { } } channel.disconnect(); session.disconnect(); } catch (JSchException e) { e.printStackTrace(); throw e; } catch (IOException ex) { ex.printStackTrace(); } return status; } public String parseShellPrompt(String buffer) { String sp = ""; int len = buffer.length(); if (len < 1) { return ""; } int pos_end = len - 1; int pos_begin = 0; char ch = buffer.charAt(pos_end); while (ch == '\r' || ch == '\n') { pos_end--; ch = buffer.charAt(pos_end); } pos_begin = pos_end; ch = buffer.charAt(pos_begin); while (ch != '\r' && ch != '\n') { pos_begin--; ch = buffer.charAt(pos_begin); } sp = buffer.substring(pos_begin + 1, pos_end); return sp; } public void connect(String user, String password) throws JSchException { try { session = jsch.getSession(user, host, port); session.setPassword(password); session.setUserInfo(defaultUserInfo); session.connect(timeout); try { Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } } catch (JSchException e) { e.printStackTrace(); throw e; } } public void connect() throws JSchException { try { session = jsch.getSession(user, host, port); session.setPassword(password); session.setUserInfo(defaultUserInfo); session.connect(); try { Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } } catch (JSchException e) { e.printStackTrace(); throw e; } } public void disconnect() { if (session != null) { session.disconnect(); } } public boolean isConnected() { if (session != null && session.isConnected()) { return true; } else { return false; } } private boolean isGetSuccessReturn(String actualReturn, String wantReturn) throws RuntimeException { Vector<String> wantsuccess = new Vector<String>(); Vector<String> wantfailuer = new Vector<String>(); int i = 0; String strtemp = ""; int itemp = -1; parseWantReturn(wantReturn, wantsuccess, wantfailuer); Iterator<String> iter = wantfailuer.iterator(); while (iter.hasNext()) { strtemp = (String) iter.next(); itemp = actualReturn.indexOf(strtemp); if (-1 != itemp) { throw new RuntimeException(strtemp); } } iter = wantsuccess.iterator(); while (iter.hasNext()) { strtemp = (String) iter.next(); itemp = actualReturn.indexOf(strtemp); if (-1 != itemp) { return true; } } return false; } private void parseWantReturn(String wantReturn, Vector<String> wantSuccess, Vector<String> wantFailure) { String allsuccess = ""; String allfailure = ""; String[] strtemp; int i = 0; if (null == wantReturn) { return; } // parse by "^^" StringTokenizer st = null; /*st = new StringTokenizer(wantReturn, OSPromptType.ERRPROMPTTOKEN); int len = st.countTokens(); if (len != 2) { allfailure = ""; allsuccess = wantReturn; } else { allsuccess = st.nextToken(); allfailure = st.nextToken(); } // parse by ",," if (allsuccess.length() > 0) { st = new StringTokenizer(allsuccess, OSPromptType.PROMPTTOKEN); while (st.hasMoreTokens()) { wantSuccess.add(st.nextToken()); } } if (allfailure.length() > 0) { st = new StringTokenizer(allfailure, OSPromptType.PROMPTTOKEN); while (st.hasMoreTokens()) { wantFailure.add(st.nextToken()); } }*/ } public String getActualReqult(String message, String token, int posBegin) { String actualresult = ""; int pos = 0; pos = message.indexOf(token, posBegin); if (pos == -1) { pos = message.length(); } actualresult = message.substring(posBegin, pos); return actualresult; } public static class ShellChannelWrapper { private Channel shellChannel; private PipedInputStream pins; private PipedOutputStream pouts; private ByteArrayOutputStream out; public void createNewShellChannel(Session jschSession) throws Exception { shellChannel = jschSession.openChannel("shell"); pins = new PipedInputStream(); pouts = new PipedOutputStream(); out = new ByteArrayOutputStream(2048); shellChannel.setInputStream(pins); shellChannel.setOutputStream(out); pouts.connect(pins); shellChannel.connect(); } public Channel getShellChannel() { return shellChannel; } public void setShellChannel(Channel shellChannel) { this.shellChannel = shellChannel; } public PipedInputStream getPins() { return pins; } public void setPins(PipedInputStream pins) { this.pins = pins; } public PipedOutputStream getPouts() { return pouts; } public void setPouts(PipedOutputStream pouts) { this.pouts = pouts; } public ByteArrayOutputStream getOut() { return out; } public void setOut(ByteArrayOutputStream out) { this.out = out; } } /* * public static void main(String[] args) throws Exception { SSHProtocol ssh = * new SSHProtocol("111.111.11.11",22); StringBuffer sb = new * StringBuffer(); int status = -1; String[] commands = {"passwd * test080514","test","test"}; String[] response = {"New password,,New UNIX * password^^Unknown user name", "Retype new password,,Retype new UNIX * password","#"}; String[] commands2 = {"pwd"}; String[] response2 = {"#"}; * String tmp; * * try { ssh.connect("root","123456"); } catch (Exception e) {} * * /*status = ssh.execCommand("useradd test080514", sb); * System.out.println("useradd status = "+status+" result = "+sb); * sb.setLength(0); status = ssh.execCommand("useradd test080514", sb); * System.out.println("useradd(existent user) status = "+status+" result = * "+sb); * * sb.setLength(0); status = ssh.execCommand("usermod -g root test080514", * sb); System.out.println("usermod status = "+status+" result = "+sb); * sb.setLength(0); status = ssh.execCommand("usermod -g root test0805140", * sb); System.out.println("usermod(noexistent user) status = "+status+" * result = "+sb); sb.setLength(0); status = ssh.execCommand("usermod -g * root0 test080514", sb); System.out.println("usermod(existent group) * status = "+status+" result = "+sb); */ // System.out.println("passwd result = "+ssh.execShell(commands, response, // true)); // commands[0] = "passwd test0805140"; // System.out.println("passwd(noexistent user) result = // "+ssh.execShell(commands, response, true)); /* * sb.setLength(0); status = ssh.execCommand("cut -d: -s -f1,2 * /etc/shadow|grep -w test080514", sb); System.out.println("grep status = * "+status+" result = "+sb); sb.setLength(0); status = ssh.execCommand("cut * -d: -s -f1,2 /etc/shadow|grep -w test0805140", sb); * System.out.println("grep(noexistent user) status = "+status+" result = * "+sb); * * * sb.setLength(0); status = ssh.execCommand("userdel test080514", sb); * System.out.println("userdel status = "+status+" result = "+sb); * sb.setLength(0); status = ssh.execCommand("userdel test0805140", sb); * System.out.println("userdel(noexistent user) status = "+status+" result = * "+sb); * * sb.setLength(0); status = ssh.execCommand("cat /etc/passwd", sb); * System.out.println("cat /etc/passwd status = "+status+" result = "+sb); * * sb.setLength(0); status = ssh.execCommand("cat /etc/group", sb); * System.out.println("cat /etc/group status = "+status+" result = "+sb); */ /* * tmp = ssh.execShell(commands2, response2, true); * System.out.println("fetch=true, * pwd=\n"+tmp+"\nshellprompt="+ssh.parseShellPrompt(tmp)); tmp = * ssh.execShell(commands2, response2, false); * System.out.println("fetch=false, * pwd=\n"+tmp+"\nshellprompt="+ssh.parseShellPrompt(tmp)); * * sb.setLength(0); status = ssh.execCommand("su - jiangh", sb); * System.out.println("su status = "+status+" result = "+sb); * sb.setLength(0); status = ssh.execCommand("su - jiangh0", sb); * System.out.println("su(noexistent user) status = "+status+" result = * "+sb); * * sb.setLength(0); status = * ssh.execCommand("111.111.11.11",22,"root","123456","ls -l",sb); * System.out.println("ls status = "+status+" result = "+sb); * sb.setLength(0); status = * ssh.execCommand("111.111.11.11",22,"root","123456","ls0 -l",sb); * System.out.println("ls(error) status = "+status+" result = "+sb); } */ }
相关推荐
基于改进粒子群算法的DG储能选址定容优化模型:解决电力系统时序性问题的可靠程序解决方案,基于改进粒子群算法的DG储能选址定容模型优化解决电力系统问题,DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题。下面我将对程序进行详细分析。 首先,程序开始时加载了一些数据文件,包括gfjl、fljl、fhjl1、cjgs和fhbl。这些文件可能包含了电力系统的各种参数和数据。 接下来是一些参数的设置,包括三种蓄电池的参数矩阵、迭代次数、种群大小、速度更新参数、惯性权重、储能动作策略和限制条件等。 然后,程序进行了一些初始化操作,包括初始化种群、速度和适应度等。 接下来是主要的迭代过程。程序使用粒子群算法的思想,通过更新粒子的位置和速度来寻找最优解。在每次迭代中,程序计算了每个粒子的适应度,并更新个体最佳位置和全局最佳位置。 在每次迭代中,程序还进行了一些额外的计算,如潮流计算、储能约束等。这些计算可能涉及到电力系统的潮流计算、功率平衡等知识点。 最后,程序输
数学建模相关主题资源2
内容概要:本文详细介绍了一系列用于科学研究、工程项目和技术开发中至关重要的实验程序编写与文档报告撰写的资源和工具。从代码托管平台(GitHub/GitLab/Kaggle/CodeOcean)到云端计算环境(Colab),以及多种类型的编辑器(LaTeX/Microsoft Word/Overleaf/Typora),还有涵盖整个研究周期的各种辅助工具:如可视化工具(Tableau)、数据分析平台(R/Pandas)、项目管理工具(Trello/Jira)、数据管理和伦理审核支持(Figshare/IRB等),最后提供了典型报告的具体结构指导及其范本实例链接(arXiv/PubMed)。这为实验流程中的各个环节提供了系统的解决方案,极大地提高了工作的效率。 适合人群:高校学生、科研工作者、工程技术人员以及从事学术写作的人员,无论是新手入门还是有一定经验的人士都能从中受益。 使用场景及目标:帮助读者高效地准备并开展实验研究活动;促进团队间协作交流;规范研究报告的形式;提高对所收集资料的安全性和隐私保护意识;确保遵循国际公认的伦理准则进行实验。
四轮毂驱动电动汽车稳定性控制策略:基于滑模与模糊神经网络的转矩分配与仿真研究,四轮毂驱动电动汽车稳定性控制:基于滑模与模糊神经网络的转矩分配策略及联合仿真验证,四轮毂驱动电动汽车稳定性控制,分布式驱动转矩分配。 上层基于滑模,模糊神经网络控制器决策横摆力矩,下层基于动态载荷分配,最优分配,平均分配均可做。 simulink与carsim联合仿真。 ,四轮毂驱动;电动汽车稳定性控制;分布式驱动;转矩分配;滑模控制;模糊神经网络控制器;横摆力矩;动态载荷分配;最优分配;平均分配;Simulink仿真;Carsim仿真,四驱电动稳定性控制:滑模与模糊神经网络决策的转矩分配研究
本资源提供了一份详细的PyCharm安装教程,涵盖下载、安装、配置、激活及使用步骤,适合新手快速搭建Python开发环境。
毕业设计
原版宋体.ttf,原版宋体安装文件,安装方式,直接右键安装。
利用Xilinx FPGA内嵌的软核处理器MicroBlaze,加上自主编写的AXI_IIC控制器,实现对IMX327传感器IIC总线的控制,同时辅以UART调试串口,实现系统状态的实时监控与调试。
在 GEE(Google Earth Engine)中,XEE 包是一个用于处理和分析地理空间数据的工具。以下是对 GEE 中 XEE 包的具体介绍: 主要特性 地理数据处理:提供强大的函数和工具,用于处理遥感影像和其他地理空间数据。 高效计算:利用云计算能力,支持大规模数据集的快速处理。 可视化:内置可视化工具,方便用户查看和分析数据。 集成性:可以与其他 GEE API 和工具无缝集成,支持多种数据源。 适用场景 环境监测:用于监测森林砍伐、城市扩展、水体变化等环境问题。 农业分析:分析作物生长、土地利用变化等农业相关数据。 气候研究:研究气候变化对生态系统和人类活动的影响。
毕业设计
整个文件的代码
名字微控制器_STM32_DFU_引导加载程序_dapboo_1740989527.zip
详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/145991332
anaconda配置pytorch环境
立体仓库控制组态王6.55与三菱PLC联机仿真程序:视频教程与IO表接线图CAD详解,9仓位立体仓库控制系统优化方案:组态王6.55与三菱PLC联机仿真程序视频教程及IO表接线图CAD详解,9仓位立体仓库控制组态王6.55和三菱PLC联机仿真程序+视频+带io表接线图CAD ,关键词:立体仓库;控制组态王6.55;三菱PLC;联机仿真程序;视频;io表接线图;CAD,立体仓库控制组态王与三菱PLC联机仿真程序资源包
基于Maxwwell设计的经典外转子永磁同步电机案例:直流母线24V,大功率与高效率驱动设计,基于Maxwell设计的经典永磁同步电机案例:200W功率,外转子结构,直流母线电压与电机参数详解,基于maxwwell设计的经典200W,2200RPM 外转子,直流母线24V,42极36槽,定子外径81.5 轴向长度15 ,0.86Nm, 永磁同步电机(PMSM)设计案例,该案例可用于生产,或者学习用 ,经典设计案例; 200W; 2200RPM外转子; 直流母线24V; 42极36槽; 定子外径81.5; 轴向长度15; 永磁同步电机(PMSM); 生产学习用。,经典200W永磁同步电机设计案例:Maxwell外转子,高效率2200RPM直流母线系统
C# Modbus RTU协议主站设计工程源码详解:支持多从站访问与多线程实现,带注释开源dll文件,C# Modbus RTU协议主站设计工程源码解析:多线程实现访问多个从站功能的开源dll文件,C# Modbus RTU协议主站设计工程源码带注释,开源dll文件,支持访问多个从站,多线程实现 ,C#; Modbus RTU协议; 主站设计; 工程源码; 注释; 开源dll; 多从站访问; 多线程实现,《C# Modbus RTU主站源码:多线程支持访问多从站开源DLL文件详解》
MATLAB Simulink下的四旋翼无人机PID控制仿真模型研究,MATLAB Simulink下的四旋翼无人机PID控制仿真模型研究,MATLAB Simulink 四旋翼仿真模型 四轴无人机PID控制 ,MATLAB; Simulink; 四旋翼仿真模型; 四轴无人机; PID控制,MATLAB Simulink四旋翼仿真模型中四轴无人机的PID控制研究
复现文献中COMSOL模拟天然气水合物两相渗流的研究,COMSOL模拟天然气水合物两相渗流:文献复现与分析,comsol天然气水合物两相渗流,文献复现 ,comsol; 天然气水合物; 两相渗流; 文献复现,复现文献:comsol模拟天然气水合物两相渗流研究