为公司的部署工程师书写了一个autoIt应用程序,现在遇到下面的一种情况:

产品分服务器端和客户端,启动的时候,会启用1785端口,然后彼此通信;

现在我的autoIt应用程序需要做的事情是:

如果1785端口被占用,该怎么办? 如果部署工程师熟悉配置文件,把端口1785更换成别的端口怎么办?

解决方案如下:

1. 产品开发组应该配置自己的端口为不常用端口,定义一个小的范围,于是可以通过AutoIt,判断目前配置的端口是否在1700-1710之间,只要在这个之间,就来判断该端口是否打开,如果打开了,就可以考虑关闭使用该端口的应用程序;如果不在 1700-1710之间,就给出提示信息:端口信息配置有误,让实施人员联系开发人员重新配置。

2. 调用dos命令,netstat -ano|findstr ":1701" 可以判断1701端口是否被占用。

如果返回的是空字符串,表明端口没有被占用,不影响配置文件的继续执行;

如果返回的端口不为空,就需要做以下几件事:

1) 获取使用1701端口的所有应用程序PID

;Get the PIDs which take the $port
Func get_PIDs($port)
$tcp_str = _GetDOSOutput('netstat -aon|findstr ":' & $port &'"')
;ConsoleWrite($tcp_str & @CRLF)
$tcp_array = StringSplit($tcp_str, @CR)
$len = UBound($tcp_array)
Local $pids[$len-]
For $i = To $len-
$splits = StringSplit($tcp_array[$i], " ")
$pid =_ArrayPop($splits)
_ArrayPush($pids, $pid)
Next
Return _ArrayUnique($pids)
EndFunc

2. 关闭使用了1701端口的应用程序

;Close the process by the known port
Func close_process_by_port($port)
$pids = get_PIDs($port)
For $i = To UBound($pids) -
If $pids[$i] <> And $pids[$i] <> "" Then
close_process(Number($pids[$i]))
EndIf
Next
EndFunc

3. 关于close_process 函数(以前该函数使用了判断语句:ProcessExists,如果存在就删除,不存在就不删除,但是这样会导致某些问题:程序被意外关闭了,此时内存中该程序还是存在的,可是ProcessExists 却判断不存在,就什么工作都不做了)

; Close some process
Func close_process($process_name)
;We will close $process_name no matter it exists or not.
ProcessClose($process_name)
ProcessWaitClose($process_name)
EndFunc

4. 关于_GetDOSOutput 函数,该函数是从别人那儿获取的,难点在参数 $STDERR_CHILD 以及 $STDOUT_CHILD,为了获取的结果准确,$sCommand尽量细节一些,确保该函数能获取想要的结果。

; Return the dos command output to a string
Func _GetDOSOutput($sCommand)
Local $iPID, $sOutput = ""
$iPID = Run('"' & @ComSpec & '" /c ' & $sCommand, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
While
$sOutput &= StdoutRead($iPID, False, False)
If @error Then
ExitLoop
EndIf
Sleep()
WEnd
Return $sOutput
EndFunc

5. 以上的准备工作完成之后,就可以完成主函数里面的内容了。

$port = get_tcp_port($sync_file)
_GUICtrlListBox_AddString($hListBox, "Check port: " & $port & " whether it is in use or not")
If $port > And $port < Then
close_process_by_port($port)
Else
_GUICtrlListBox_AddString($hListBox, "端口: " & $port & " 不正确,请正确配置 sync.xml 文件节点 TCP:LocalHostPort")
EndIf

该思路可以解决目前的问题,也许有人会觉得:凭啥关掉别人的程序?就因为端口占用了?难道不能新生成一个端口?

在测试自己的应用程序的时候,我尝试设置一些奇怪的端口,比喻1, 135,然后运行close_process_by_port,我发现系统会崩溃;

于是我设置关闭应用程序,也只有在端口在1700-1710之间,最大程度避免风险;

目前该应用程序会运行在局域网里面两台可以连接的机器上,如果我随机生成没有被占用的端口,就没法保证服务器,客户端端口的一致性。目前我还没有好的思路搞同步。

AutoIt:如何处理应用程序端口被占用的情况的更多相关文章

  1. win7电脑遇到端口被占用的情况该如何查看并将其关闭

    转载:http://www.jb51.net/os/windows/203315.html 端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,有很多人不知道该如何查看电 ...

  2. 如何解决windows 80端口被占用的情况

    window下如果在安装某个软件或者启动tomcat时 会遇到80端口被占用的情况,通过命令 netstat -ano 查看端口被占用情况 找到占用80端口的进程ID,然后我们在任务管理器当中将这个进 ...

  3. NodeJs端口被占用的情况

    在NodeJs运行的时候,我们往往会遇到一个问题:“端口被占用”,这个问题,我们的处理办法有哪些呢? 这里我只介绍一下linux下的方法: 1.使用nodeme(忘记是不是这个啦,回去查下,这个要安装 ...

  4. Linux 中如何查询端口被占用的情况

    Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000,如下图 可以看到8000端口已经被轻量级文件系统转发服务lwfs ...

  5. 解决IIS Express 80端口被占用的情况

    VS2012运行站点的时候提示“无法启动IIS Express Web服务器,端口80正在使用” 于是CMD查看了一下端口使用情况,并且在任务管理器中查看相应的进程,但始终觉得不对,因为显示是Syst ...

  6. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令   1.列出所有端口的情 ...

  7. ApacheServer-----关于443端口被占用的解决方法

    最经公司项目需要经过Apache服务器转发,自己也下载了ApacheServer,但是在启动的过程中,遇到443端口被占用,网上看了一些解决方法,都不对,没有解决问题. 执行启动命令httpd -k ...

  8. 端口被占用怎么办?如何查看win7电脑端口是否被占用

    Windows7操作系统的酷炫和强大已经深受用户们的喜欢了,这里根大家分享的是教你查看win7电脑端口是否被占用的技巧,端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况 ...

  9. xampp开户,apache打开出现端口被占用提示

    刚装上去的时候,可以打开xampp,但是重启的时候出现以后以下问题 13:49:02  [Apache]     Error: Apache shutdown unexpectedly.13:49:0 ...

随机推荐

  1. OpenGL - Tessellation Shader 【转】

    http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...

  2. JavaSE入门学习6:Java基础语法之运算符和语句(上)

    继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age ...

  3. C 标准库 - <float.h>

    C 标准库 - <float.h> 简介 C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量.这些常量是由 ANSI C 提出的,这让程序更具有可移植性.在讲解这 ...

  4. MDCC 2014移动开发人员大会參会实录

    MDCC 2014移动开发人员大会參会实录 详细讲什么我就不反复了,各大媒体的编辑整理的比我的好! 我就晒晒图!后面有惊喜哦! 会场地点:早上七点多.天色有点暗,主要是阴天的原因. watermark ...

  5. 简单理解 ES7 Decorator(装饰器)

    如何使用ES7 Decorator给你的游戏人物开挂? // 预告: 本文有点小难度,对js不太熟的人可能比较懵逼 // 本文的目的是让你们知其然 // ======================= ...

  6. selenium之 chromedriver与chrome版本映射表(更新至v2.29)

    最新的chromedriver与chrome的对应关系表: chromedriver版本 支持的Chrome版本 v2.37 v64-66 v2.36 v63-65 v2.35 v62-64 v2.3 ...

  7. xml文件的根节点layout_width或者layout_height设置无效果的原因分析

    在android开发中相信大家对ListView.GridView等组建都非常熟悉,在使用它们的时候须要自己配置相关的Adapter,而且配置现骨干的xml文件作为ListView等组建的子View, ...

  8. 从头认识java-14.1 再次对照数组与容器

    这一章节我们再次深入的对照数组与容器. 数组与容器主要集中在三个方面:效率.类型.基础类型. 我们能够从三方面做出对照. 1.效率 这里的下来是指add和get 的速度 以下以add为例: packa ...

  9. freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析

    接下来使用自己的课外歇息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要參考官方文档freescale linux sdk START_HERE.html,首先 ...

  10. C#用Infragistics 导入导出Excel

    最近项目中有数据的导入导出Excel的需求,这里做简单整理. 公司用的是Infragistics的产品,付费,不需要本地安装Office. 有需要的朋友可以下载 Infragistics.2013.2 ...