AutoIt:如何处理应用程序端口被占用的情况
为公司的部署工程师书写了一个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:如何处理应用程序端口被占用的情况的更多相关文章
- win7电脑遇到端口被占用的情况该如何查看并将其关闭
转载:http://www.jb51.net/os/windows/203315.html 端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,有很多人不知道该如何查看电 ...
- 如何解决windows 80端口被占用的情况
window下如果在安装某个软件或者启动tomcat时 会遇到80端口被占用的情况,通过命令 netstat -ano 查看端口被占用情况 找到占用80端口的进程ID,然后我们在任务管理器当中将这个进 ...
- NodeJs端口被占用的情况
在NodeJs运行的时候,我们往往会遇到一个问题:“端口被占用”,这个问题,我们的处理办法有哪些呢? 这里我只介绍一下linux下的方法: 1.使用nodeme(忘记是不是这个啦,回去查下,这个要安装 ...
- Linux 中如何查询端口被占用的情况
Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000,如下图 可以看到8000端口已经被轻量级文件系统转发服务lwfs ...
- 解决IIS Express 80端口被占用的情况
VS2012运行站点的时候提示“无法启动IIS Express Web服务器,端口80正在使用” 于是CMD查看了一下端口使用情况,并且在任务管理器中查看相应的进程,但始终觉得不对,因为显示是Syst ...
- windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令 1.列出所有端口的情 ...
- ApacheServer-----关于443端口被占用的解决方法
最经公司项目需要经过Apache服务器转发,自己也下载了ApacheServer,但是在启动的过程中,遇到443端口被占用,网上看了一些解决方法,都不对,没有解决问题. 执行启动命令httpd -k ...
- 端口被占用怎么办?如何查看win7电脑端口是否被占用
Windows7操作系统的酷炫和强大已经深受用户们的喜欢了,这里根大家分享的是教你查看win7电脑端口是否被占用的技巧,端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况 ...
- xampp开户,apache打开出现端口被占用提示
刚装上去的时候,可以打开xampp,但是重启的时候出现以后以下问题 13:49:02 [Apache] Error: Apache shutdown unexpectedly.13:49:0 ...
随机推荐
- Proftpd快速搭建FTP服务器
前言 在Linux系统中,FTP服务器软件有很多,都已经成熟,像vsftpd, wu-ftp, Pure-FTPd等.但这些软件安装配置起来都比较麻烦,搭建个人的FTP服务器,还是Proftpd比较简 ...
- py3处理数据库
处理mysql使用 pymysql模块 import pymysql conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passw ...
- Windows 无法卸载IE9怎么办
1 如下图所示,使用自带的卸载工具无法卸载IE9 运行命令提示符,粘贴下面的命令 FORFILES /P %WINDIR%\servicing\Packages /M Microsoft-Window ...
- 【转载】C#中的==、Equal、ReferenceEqual
1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...
- What is the relationship between Xcode, Swift and Cocoa?
Xcode is an IDE for developing Swift or Objective-C applications, which can use the Cocoa API (which ...
- Core Data 版本号迁移经验总结
大家在学习和使用Core Data过程中,第一次进行版本号迁移的经历一定是记忆犹新,至少我是这种,XD.弄的不好,就会搞出一些因为迁移过程中数据模型出错导致的Crash.这里总结了一下Core Dat ...
- Juce源代码分析(九)应用程序基类ApplicationBase
在前面的几篇文章,分析的都是Juce库里面Core模块的内存部分,除了骨灰级C++爱好者之外,貌似大家对这些都不是非常感兴趣.相信大家更想知道Juce是怎么用于产品开发,而对于它的构成不是非常感兴趣. ...
- 【BZOJ4950】lydsy七月月赛 C 二分图最大匹配
[BZOJ4950]lydsy七月月赛 C 题面 题解:比较直接的想法就是:每行,每列的最大值都留下,剩下的格子都变成1.但是如果一个格子既是行的最大值又是列的最大值,那么我们只需要把它留下即可.这就 ...
- eacharts 根据后台数据生成柱状图
说明:开发环境vs2012 ,asp.net mvc4项目,c#语言 1.效果图 2.HTML 前端代码 <%@ Page Language="C#" AutoEventWi ...
- jvm -Xms -Xmx
1 -Xms -X表示这是一个“-X”参数,m即memory,s即start,这个是jvm初始可以使用的整个堆的大小. 2 -Xmx x表示max,jvm最大可以使用的整个堆的大小. 3 oracle ...