一、项目需求

安装某软件,配置时候需要填写空闲的端口。查看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个连续的空闲端口相关推荐

  1. linux 端口tnpl,利用Python找出9个连续的空闲端口

    这篇文章主要介绍了Python找出9个连续的空闲端口的方法,感兴趣的小伙伴们可以参考一下 一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为window ...

  2. 查找自己电脑上的空闲端口号

    网络编程时会用到端口号,那么如何查看已占用的端口号,查找空闲端口号? 步骤如下: 1.首先按下win+R键打开运行窗口,然后输入cmd按回车进入命令行 2.然后输入netstat -an按回车显示所有 ...

  3. python求近似值_python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配...

    已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接 ...

  4. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  5. Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数

    题目 /** * 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. * 示例 ...

  6. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...

  7. 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  8. python 已知一个字符,在一个list中找出近似值或相似值, 模糊匹配

    已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接 ...

  9. 实验4.1对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 。 要求: 1)数组有10个元素; 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息; 3)输出时,首先输出数组

    /*SY4.1 题目描述 对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 . 要求: 1)数组有10个元素: 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息: 3)输出 ...

最新文章

  1. css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏
  2. 遵义春季招生计算机学校,遵义计算机学校招生
  3. Unsupported gpu architecture 'compute_*'2017解决方法
  4. poj 3984 迷宫问题 BFS
  5. http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
  6. c/c++面试试题(一)
  7. 对角矩阵(diagonal matrix)
  8. 《数学之美》读书笔记
  9. 公司办公提高无线网络质量解决方案
  10. W2019SRV and W10 (1809) Office2019 CN
  11. Pta题目集:汽车加油问题 (20 分)
  12. Vijos 1055 奶牛浴场 最大子矩阵 算♂法①
  13. 活跃地址下降,成交量大幅上涨,疑似青黄不接——陀螺财经周报第八期
  14. FreeFileSync命令用法
  15. 卡通渲染技巧(一)——漫反射部分
  16. select2中文选项通过拼音或者首字母快速定位选项
  17. 华清远见嵌入式开发学习的6大阶段
  18. vhdl7我学习得第一个fpga项目——倒计时显示
  19. 四川巴中中学2021高考成绩查询,巴中中学2021年统招分数线是多少?
  20. 入门金融数据分析-Task1-数据了解and熟悉赛题

热门文章

  1. Win11预览版镜像泄露,来看看!
  2. 赠书:深入理解MySQL主从原理
  3. 他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...
  4. Redisson 是如何实现分布式锁的?
  5. 面试:如何从大量的 URL 中找出相同的 URL?
  6. 每日一皮:某程序员对书法十分感兴趣。一日饭后突生雅兴...
  7. YAML中多行字符串的配置方法总结
  8. Spring Security 实战干货:实现自定义退出登录
  9. 给迷茫的Java员一些中肯建议,你还在虚度光阴吗?
  10. java C语言内存占用_使用Cgroup限制Java使用的内存量-思路