java获得一个空闲端口号_Python找出9个连续的空闲端口
一、项目需求
安装某软件,配置时候需要填写空闲的端口。查看5个平台的某个端口是否被占用
5个平台为windows, linux, aix, hp, solaris
二、实现方案有两种
1、利用 python 的 socket 模块里的
def isInuse(ipList, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
flag=True
for ip in ipList:
try:
s.connect((ip, int(port)))
s.shutdown(2)
print '%d is inuse' % port
flag=True
break
except:
print '%d is free' % port
flag=False
return flag
在try 模块中 如果 s.connect((ip, int(port))) 如果能成功, 说明端口被占用.
否则, connect 不成功, 会进到except 中, 说明端口不被占用.
但是有个问题, 端口监听的ip 除了 "127.0.0.1","0.0.0.0" 还有可能是本机的局域网ip 如 222.25.136.17 , 或者与之通信的那台机器的ip。
可以通过这个方法获得局域网 ip
def getLocalIp():
localIP = socket.gethostbyname(socket.gethostname())
return localIP
本代码只针对 ipList = ("127.0.0.1","0.0.0.0",getLocalIp()) 这3个 ip 进行 connect
import sys
import os
import socket
def isInuse(ipList, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
flag=True
for ip in ipList:
try:
s.connect((ip, int(port)))
s.shutdown(2)
print '%d is inuse' % port
flag=True
break
except:
print '%d is free' % port
flag=False
return flag
def getLocalIp():
localIP = socket.gethostbyname(socket.gethostname())
return localIP
def checkNinePort(startPort):
flag = True
ipList = ("127.0.0.1","0.0.0.0",getLocalIp())
for i in range(1, 10):
if (isInuse(ipList, startPort)):
flag = False
break
else:
startPort = startPort + 1
return flag, startPort
def findPort(startPort):
while True:
flag, endPort = checkNinePort(startPort)
if (flag == True): #ninePort is ok
break
else:
startPort = endPort + 1
return startPort
def main():
startPort=51988
# startPort = int(sys.argv[1])
print findPort(startPort)
main()
2. 利用netstat 输出信息查找端口号匹配
第一种方法的准确性依赖于 connect((ip, int(port))) 中的 ip,到底怎样的 ip 集合才是完备的, 可以确定这个端口不被占用?
于是, 有下面这个方法
**在 linux 用 netstat -tnpl 可以得到端口监听信息,
观察 tcp 0 0 10.173.1.208:3210 0.0.0.0:* LISTEN 55563/repserver
出现了 10.173.1.208:3210 所以 3210 端口是被占用的
对这些信息进行搜索 :5000, 如果存在, 就表示5000端口是LISTEN**.
如果输出结果中不存在 :5000 的相关字符,表示这个端口不被占用.
netstat - tnpl | grep 321
tcp 0 0 10.173.1.208:3211 0.0.0.0:* LISTEN 55563/***
tcp 0 0 0.0.0.0:3212 0.0.0.0:* LISTEN 55586/***
tcp 0 0 10.173.1.208:3213 0.0.0.0:* LISTEN 55707/***
tcp 0 0 0.0.0.0:3214 0.0.0.0:* LISTEN 54272/java
tcp 0 0 0.0.0.0:3215 0.0.0.0:* LISTEN 54272/java
tcp 0 0 10.173.1.208:3216 0.0.0.0:* LISTEN 54822/***
tcp 0 0 10.173.1.208:3217 0.0.0.0:* LISTEN 34959/***
tcp 0 0 10.173.1.208:3218 0.0.0.0:* LISTEN 54849/***
依据这个思路, 给出代码.
AIX 、HP 、WINDOWS、 LINUX、 SOLARIS 这几个平台查看端口信息的方式不同,
先进行机器平台的判断
然后调用各个平台的端口占用判断函数
如果要找出连续端口, 其中只要有一个端口占用, 就跳出循环
__author__ = 'I316736'
import os
import platform
import sys
def isInuseWindow(port):
if os.popen('netstat -an | findstr :' + str(port)).readlines():
portIsUse = True
print '%d is inuse' % port
else:
portIsUse = False
print '%d is free' % port
return portIsUse
def isInuseLinux(port):
#lsof -i:4906
#not show pid to avoid complex
if os.popen('netstat -na | grep :' + str(port)).readlines():
portIsUse = True
print '%d is inuse' % port
else:
portIsUse = False
print '%d is free' % port
return portIsUse
def isInuseAix(port):
if os.popen('netstat -Aan | grep "\.' + str(port) + ' "').readlines():
portIsUse = True
print '%d is inuse' % port
else:
portIsUse = False
print '%d is free' % port
return portIsUse
def isInuseHp(port):
if os.popen('netstat -an | grep "\.' + str(port) + ' "').readlines():
portIsUse = True
print '%d is inuse' % port
else:
portIsUse = False
print '%d is free' % port
return portIsUse
def isInuseSun(port):
if os.popen('netstat -an | grep "\.' + str(port) + ' "').readlines():
portIsUse = True
print '%d is inuse' % port
else:
portIsUse = False
print '%d is free' % port
return portIsUse
def choosePlatform():
#'Windows-7-6.1.7601-SP1'
#'AIX-1-00F739CE4C00-powerpc-32bit'
#'HP-UX-B.11.31-ia64-32bit'
#'Linux-3.0.101-0.35-default-x86_64-with-SuSE-11-x86_64'
#'SunOS-5.10-sun4u-sparc-32bit-ELF'
machine = platform.platform().lower()
if 'windows-' in machine:
return isInuseWindow
elif 'linux-' in machine:
return isInuseLinux
elif 'aix-' in machine:
return isInuseAix
elif 'hp-' in machine:
return isInuseHp
elif 'sunos-' in machine:
return isInuseSun
else:
print 'Error, sorry, platform is unknown'
exit(-1)
def checkNinePort(startPort):
isInuseFun = choosePlatform()
nineIsFree = True
for i in range(1, 10):
if (isInuseFun(startPort)):
nineIsFree = False
break
else:
startPort = startPort + 1
return nineIsFree, startPort
def findPort(startPort):
while True:
flag, endPort = checkNinePort(startPort)
if (flag == True): # ninePort is ok
break
else:
startPort = endPort + 1
return startPort
def main(startPort):
firstPort=findPort(startPort)
print 'First port of nine free ports is ', firstPort
if __name__ == '__main__' :
if len(sys.argv) > 1:
print len(sys.argv)
startPort = int(sys.argv[1])
else:
startPort = 500
main(startPort)
相关知识点总结
os.popen()可以调用系统的一些shell命令
os.popen().readlines()读取调用shell命令后的回显信息
netstat -tnpl
-tnpl 各个参数的含义
-l或--listening 显示监控中的服务器的Socket。
-n或--numeric 直接使用IP地址,而不通过域名服务器。
-p或--programs 显示正在使用Socket的程序识别码和程序名称。
-t或--tcp 显示TCP传输协议的连线状况
----------
tcp 0 0 10.173.1.208:4903 0.0.0.0:* LISTEN 54849/jsagent
最后的54849/jsagent 表示 进程号 54849 进程名 jsagent
以上就是本文的全部内容,希望对大家的学习有所帮助。
java获得一个空闲端口号_Python找出9个连续的空闲端口相关推荐
- linux 端口tnpl,利用Python找出9个连续的空闲端口
这篇文章主要介绍了Python找出9个连续的空闲端口的方法,感兴趣的小伙伴们可以参考一下 一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为window ...
- 查找自己电脑上的空闲端口号
网络编程时会用到端口号,那么如何查看已占用的端口号,查找空闲端口号? 步骤如下: 1.首先按下win+R键打开运行窗口,然后输入cmd按回车进入命令行 2.然后输入netstat -an按回车显示所有 ...
- python求近似值_python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配...
已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接 ...
- 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,
题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...
- Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数
题目 /** * 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. * 示例 ...
- python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...
- 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- python 已知一个字符,在一个list中找出近似值或相似值, 模糊匹配
已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接 ...
- 实验4.1对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 。 要求: 1)数组有10个元素; 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息; 3)输出时,首先输出数组
/*SY4.1 题目描述 对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 . 要求: 1)数组有10个元素: 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息: 3)输出 ...
最新文章
- css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏
- 遵义春季招生计算机学校,遵义计算机学校招生
- Unsupported gpu architecture 'compute_*'2017解决方法
- poj 3984 迷宫问题 BFS
- http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
- c/c++面试试题(一)
- 对角矩阵(diagonal matrix)
- 《数学之美》读书笔记
- 公司办公提高无线网络质量解决方案
- W2019SRV and W10 (1809) Office2019 CN
- Pta题目集:汽车加油问题 (20 分)
- Vijos 1055 奶牛浴场 最大子矩阵 算♂法①
- 活跃地址下降,成交量大幅上涨,疑似青黄不接——陀螺财经周报第八期
- FreeFileSync命令用法
- 卡通渲染技巧(一)——漫反射部分
- select2中文选项通过拼音或者首字母快速定位选项
- 华清远见嵌入式开发学习的6大阶段
- vhdl7我学习得第一个fpga项目——倒计时显示
- 四川巴中中学2021高考成绩查询,巴中中学2021年统招分数线是多少?
- 入门金融数据分析-Task1-数据了解and熟悉赛题
热门文章
- Win11预览版镜像泄露,来看看!
- 赠书:深入理解MySQL主从原理
- 他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...
- Redisson 是如何实现分布式锁的?
- 面试:如何从大量的 URL 中找出相同的 URL?
- 每日一皮:某程序员对书法十分感兴趣。一日饭后突生雅兴...
- YAML中多行字符串的配置方法总结
- Spring Security 实战干货:实现自定义退出登录
- 给迷茫的Java员一些中肯建议,你还在虚度光阴吗?
- java C语言内存占用_使用Cgroup限制Java使用的内存量-思路