当前位置: 首页 > news >正文

网站开发公司怎么做账wordpress应用程序错误

网站开发公司怎么做账,wordpress应用程序错误,经典软文,西安知名网站推广文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户#xff0c;一直使用CS版本的信控平台#xff0c;直接安装客户Windows server服务器上#xff0c;主要对信号机设备进行在线管理、方案配时… 文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户一直使用CS版本的信控平台直接安装客户Windows server服务器上主要对信号机设备进行在线管理、方案配时、管控等其中有一项功能在网络波动情况对信号机管控失败判断信号机是否在线。大致方法是直接调用Windows的dos窗口发送 ping ip的命令显示网络情况我们新的信控平台使用Spring Cloud微服务架构使用Spring Boot构建Java服务使用google的jib插件打成docker镜像包我们使用docker虚拟化部署使用docker-compose统一管理所有服务部署在Linux服务器里客户很喜欢之前的功能需要我们在新平台里实现这个功能调用dos窗口ping网络而我们新平台是B/S架构浏览器是很难调用Windows组件去弹出窗口实现ping功能而且我们也没有限制一定使用的是Windows电脑访问有网有浏览器就行ping功能无论Windows还是Linux都是有的至于界面展现只能自己实现了 处理解决 实现ping功能并实时返回输出 代码实现有两个核心功能点一是根据不同的操作系统执行对应的系统命令进行结果接收与解析 对于第一个问题Java有现成的类库使用Runtime.getRuntime().exec(ping命令)即可对于Windows服务器需要使用GB2312解析命令执行结果对于Linux 服务器需要使用UTF_8解析命令执行结果对于ServletOutputStream.println输出中文字符串报错Not an ISO 8859-1 character问题可以使用PrintWriter.println输出代替也可以在ServletOutputStream.println输出时输出字符数组string.getBytes() 二是流式输出到请求端模拟再现一秒一次的逐步展示的效果 对于第二个问题核心是命令执行的结果输出流要实时的返回给请求端请求端能接收到主要是获取流然后按行读取按行flush()即可返回给请求端对于请求端实时渲染需要在代码的response里指定ContentType为text/event-stream这样flush刷新的返回流才能实时被前端浏览器接收到ChatGPT流式输出也是使用的这种content-type一开始是考虑使用multipart完全不行流flush后浏览器无法获取只能在流输出完成后浏览器才能获取到 具体代码如下 /*** 获取信号机的网络状态* param ip* param count* param response*/GetMapping(/ping/start)public void ping(String ip, Integer count, HttpServletResponse response) {logger.info(ping 信号机【{}】 开始 ......, ip);response.setStatus(HttpServletResponse.SC_OK);response.setContentType(text/event-stream);response.setCharacterEncoding(UTF-8);String line null;Process pro null;BufferedReader buf null;try {if (null count) {count 4;}String osName System.getProperty(os.name);if (osName.toLowerCase().contains(windows)){pro Runtime.getRuntime().exec(ping -n count ip);buf new BufferedReader(new InputStreamReader(pro.getInputStream(), GB2312));} else if (osName.toLowerCase().contains(linux)){pro Runtime.getRuntime().exec(ping -c count ip);buf new BufferedReader(new InputStreamReader(pro.getInputStream(), StandardCharsets.UTF_8));}PrintWriter out response.getWriter();while (null ! buf (line buf.readLine()) ! null){out.println(line);out.flush();}logger.info(执行ping请求结束!);out.close();} catch (Exception e){logger.error(执行ping命令出现异常);e.printStackTrace();}finally {if (null ! pro){pro.destroy();}}} 实现长ping和中断请求 主要是在请求时传输一个唯一命令id缓存到内存里当命令执行完成或者接收到打断请求时调用destroy()打断循环结束请求当然可以尝试使用kill -2去模拟CTRL C的打断可以使用Runtime.getRuntime().exec(中断命令)打断试下我的代码已经满足自己的需求了就没再尝试有兴趣的小伙伴可以试一下具体代码如下 package com.newatc.api.rest;import com.newatc.api.signalcontrol.dto.PingRequestVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map;/*** 调用系统命令并返回** author yanyulin* date 2024-1-16 15:11:55*/ RestController RequestMapping(value /api/syscmd) public class SysCmdController {private static final Logger logger LoggerFactory.getLogger(SysCmdController.class);/*** 命令id-执行过程map*/public static final MapString, Boolean COMMAND_REQUEST_MAP new HashMap();/*** 开始信号机的网络状态诊断*/PostMapping(/ping/start)public void ping(RequestBody PingRequestVO pingRequest, HttpServletResponse response) {String ip pingRequest.getIp();String cmdId pingRequest.getCmdId();Integer count pingRequest.getCount();logger.info(ping 信号机【{}】 开始 ......, ip);response.setStatus(HttpServletResponse.SC_OK);response.setContentType(text/event-stream);response.setCharacterEncoding(UTF-8);String line null;Process pro null;BufferedReader buf null;try {if (null count) {count 4;}if (count 50) {count 50;}String osName System.getProperty(os.name);if (osName.toLowerCase().contains(windows)){pro Runtime.getRuntime().exec(ping -n count ip);buf new BufferedReader(new InputStreamReader(pro.getInputStream(), GB2312));} else if (osName.toLowerCase().contains(linux)){pro Runtime.getRuntime().exec(ping -c count ip);buf new BufferedReader(new InputStreamReader(pro.getInputStream(), StandardCharsets.UTF_8));}COMMAND_REQUEST_MAP.put(cmdId, true);PrintWriter out response.getWriter();while (null ! buf (line buf.readLine()) ! null){out.println(line);out.flush();if (!COMMAND_REQUEST_MAP.get(cmdId)) {pro.destroy();}}logger.info(执行ping请求结束!);out.close();} catch (Exception e){logger.error(执行ping命令出现异常);e.printStackTrace();}finally {if (null ! pro){pro.destroy();}COMMAND_REQUEST_MAP.remove(cmdId);}}/*** 打断命令执行状态*/PostMapping(/ping/stop)public void ping(RequestBody PingRequestVO requestVO) {COMMAND_REQUEST_MAP.put(requestVO.getCmdId(), false);} }docker容器找不到ping命令处理 我们打包导出的docker镜像无法使用ping命令报错找不到这个命令bash: ping:command not found我们使用的是极简镜像eclipse-temurin:11-jre-focal这个版本里的ubuntu没有安装不需要的命令具体可以参考我的这篇博文《自制Java镜像发布到dockerhub公网使用》也可以直接使用我发布到公网的包含ping命令的jre11镜像文件1363241277/jre11:11-jre-focal主要思路就是打包使用的原始Java镜像里要已经安装ping等需要的命令
http://www.hkea.cn/news/14313325/

相关文章:

  • 辛集建设局网站网站建设 三合一
  • 网页设计代码模板网站如何注册域名
  • 东莞网站建站推广seo网络推广技术员招聘
  • 网站平台设计费用ui软件界面设计
  • 优秀网站赏析建网站底部怎么做的
  • 南沙商城网站建设景安做网站教程
  • 网站建设服务那一个便宜湖北省建设厅质监站网站
  • 广州建造网站公司熊岳网站怎么做
  • 品牌策划网站建设wordpress替换域名
  • 池州网站制作优化招聘网站怎么做介绍
  • 实战营销型网站建设wordpress目录seo
  • 论坛类网站搭建wordpress网站密码
  • 网站设计要多少钱淮南模板网站建设费用
  • 怎么做自己的刷赞网站织梦移动端网站怎么做
  • google seo 营销网站网站建设项目规划书目录
  • 整人关不掉的网站怎么做医疗网站优化怎么做
  • R shinny网站开发动漫设计难不难
  • wordpress站内301女性手机网站模板
  • 做个网站需要多久wordpress博客建站
  • 可以做砍价活动的网站免费python在线网站
  • 一家只做特卖的网站wordpress 七牛加速
  • 企业营销型网站费用图片制作软件免费版
  • 国内做免费的视频网站电商思维做招聘网站
  • 建网站要花钱吗好看的标志设计
  • 医疗今科云平台网站建设技术开发一句话宣传自己的产品
  • 无锡h5网站建设做直播的网站
  • 自己做本地视频网站百姓网推广怎么收费标准
  • 行业网站设计公司大连网站排名网络推广公司
  • 查看网站cms苏宁易购网站建设 的定位
  • 泰安市建设职工培训中心电话网站张斌网站建设