java中如何判断端口被占用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何判断端口被占用相关的知识,希望对你有一定的参考价值。

是这样的的,我的这个类是使用的mina的SocketAcceptor做的这个服务器,要用到到一个端口,可无论启动多次,这个类,始终不报错,想找个通用的方法,在调用这个类之前判断下端口再启动,。。。。

参考技术A 楼主,经验告诉我们,只要使用的是同一端口,肯定会抛端口已经被绑定并使用的异常,不可能不报错的!
除非是你把异常信息给去掉了,好好检查下你是否打印异常信息了吧。

有问题欢迎提问,满意请采纳!追问

实验告诉我,这个类确实没有抛异常。!

下面有个catch语句,可每次运行不报错,经过测试。只有一个端口在用,为什么不报错,就不得而知了,对这个mina不是很熟,

追答

楼主,绑定监听端口请使用这个:
//绑定监听端口
acceptor.bind(new InetSocketAddress(端口号));

百分之百报错,你试试就知道了。

追问

我下面还有一行,acceptor.bind();和你说的不一样?????但是就是不抛出异常1

追答

有区别的。你试了就知道了。具体为什么不一样,你可以查阅相关资料就知道了。

参考技术B 如果有多个 IP 而你是使用机器名的话可以启动多次,如果是明确指定 IP 就会得到 Already bind exception

VC++获取系统TCPUDP端口使用信息,并判断端口是否被占用(附源码)

       有时候我们需要判断某端口有没有被系统或者其他占用,代码该如何实现呢?其实很简单,我们可以调用系统API函数GetExtendedTcpTable和GetExtendedUdpTable,分别获取TCP和UDP端口信息,其中的信息包括与端口关联的本端IP和远端IP,占用该端口的进程id等,对应的结构体如下所示:

typedef struct _MIB_TCPROW_OWNER_MODULE

    DWORD           dwState;
    DWORD           dwLocalAddr;
    DWORD           dwLocalPort;
    DWORD           dwRemoteAddr;
    DWORD           dwRemotePort;
    DWORD           dwOwningPid;
    LARGE_INTEGER   liCreateTimestamp;
    ULONGLONG       OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
 MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE;

      光有进程id,无法直观地看到端口被哪个程序占用了,当然我们可以通过进程id到任务管理器中去查找。通过进程的id,我们可以获取系统进程快照,得到对应的进程名称,代码如下:

BOOL GetProcessNameById( u32 ProcessId,TCHAR ProcessName[MAX_PATH] )

	HANDLE hProcessSnap;
	PROCESSENTRY32 pe32;

	// 快照系统所有进程
	hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );// 第二个参数无效
	if( hProcessSnap == INVALID_HANDLE_VALUE )
	
		return FALSE;
	

	// 结构体大小一定要填充。
	pe32.dwSize = sizeof( PROCESSENTRY32 );

	// 获取第一个进程信息
	if( !Process32First( hProcessSnap, &pe32 ) )
	
		CloseHandle( hProcessSnap );          // clean the snapshot object
		return FALSE;
	

	// 遍历所有进程
	do
	
		if( pe32.th32ProcessID==ProcessId ) 
		
			lstrcpy( ProcessName, pe32.szExeFile );
            CloseHandle(hProcessSnap );
			return TRUE;
		
	 while( Process32Next( hProcessSnap, &pe32 ) );


	CloseHandle(hProcessSnap );
    return FALSE;

          判断端口是否被占用的接口CheckPortUsed封装如下:(代码中还保存了端口的详细信息)

// 端口的详细信息
typedef struct tagTNetInfo

	emPortType  bySockType; // TCP、UDP
	DWORD dwLocalIP;     // 网络序
	DWORD dwRemoteIP;    // 网络序
	DWORD dwLocalPort;   // 网络序
	DWORD dwRemotePort;  // 网络序
	DWORD dwPID;
	TCHAR szProcessName[MAX_PATH];
TNetInfo;


BOOL CheckPortUsed( int nPort )

	// 1、获取TCP连接及端口信息
	// 第一次调用时不知道要传入的缓冲区大小,所以要试探一下,参数dwTcpCount会返回实际大小
	PMIB_TCPTABLE_OWNER_MODULE pTCPExTable = new MIB_TCPTABLE_OWNER_MODULE;
	DWORD dwTcpCount = sizeof(MIB_UDPTABLE_OWNER_MODULE);
	if ( GetExtendedTcpTable( pTCPExTable, &dwTcpCount, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 ) == ERROR_INSUFFICIENT_BUFFER )
	
		pTCPExTable = (MIB_TCPTABLE_OWNER_MODULE *)new char[dwTcpCount];
	
	DWORD dwRet= GetExtendedTcpTable( pTCPExTable, &dwTcpCount, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0 );
	if( dwRet ) 
	
		return ;
	

	// 1、获取UDP连接及端口信息
	PMIB_UDPTABLE_OWNER_MODULE pUDPExTable = new MIB_UDPTABLE_OWNER_MODULE;
	DWORD dwUdpCount = sizeof(MIB_TCPTABLE_OWNER_MODULE);
	if ( GetExtendedUdpTable( pUDPExTable, &dwUdpCount, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 ) == ERROR_INSUFFICIENT_BUFFER )
	
		pUDPExTable = (MIB_UDPTABLE_OWNER_MODULE *)new char[dwUdpCount];
	
	dwRet = GetExtendedUdpTable( pUDPExTable, &dwUdpCount, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0 );
	if( dwRet ) 
	
		return ;
	

	TCHAR szProcessName[MAX_PATH]    = 0;

	vector<TNetInfo*> vtPortInfoList;

	// 获取TCP连接表
	TNetInfo *ptNetInfo;
	for( s32 i=0 ; i<pTCPExTable->dwNumEntries ; i++ ) 
	
		ptNetInfo = new TNetInfo;

		// 通过进程id获取进程名
		GetProcessNameById( hProcessSnap, pTCPExTable->table[i].dwOwningPid, szProcessName );

		ptNetInfo->bySockType  = emTCP;
		ptNetInfo->dwLocalIP   = pTCPExTable->table[i].dwLocalAddr;
		ptNetInfo->dwLocalPort = htons( pTCPExTable->table[i].dwLocalPort );
		ptNetInfo->dwRemoteIP  = pTCPExTable->table[i].dwRemoteAddr;
		ptNetInfo->dwRemotePort= htons( pTCPExTable->table[i].dwRemotePort );
		ptNetInfo->dwPID       = pTCPExTable->table[i].dwOwningPid;
		lstrcpy(ptNetInfo->szProcessName, szProcessName);

		vtPortInfoList.push_back( ptNetInfo );
	

	// 获取UDP连接表
	for( s32 i = 0; i < pUDPExTable->dwNumEntries; i++ ) 
	
		ptNetInfo = new TNetInfo;

		//PID转换为进程名
		GetProcessNameById( pUDPExTable->table[i].dwOwningPid, szProcessName );

		ptNetInfo->bySockType  = emUDP;
		ptNetInfo->dwLocalIP   = pUDPExTable->table[i].dwLocalAddr;
		ptNetInfo->dwLocalPort = htons( pUDPExTable->table[i].dwLocalPort );
		ptNetInfo->dwPID       = pUDPExTable->table[i].dwOwningPid;
		ptNetInfo->szProcessName = szProcessName;

		vtPortInfoList.push_back( ptNetInfo );
	

	DWORD dwNetPort = ntohl( nPort );
	for ( int i = 0; i < vtPortInfoList.size(); i++ )
	
		if ( dwNetPort == vtPortInfoList[i].dwLocalPort )
		
			return TRUE;
		
	

	return FALSE;

以上是关于java中如何判断端口被占用的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何判断某个 tcp 端口是否被占用?

查看端口是哪个java

VC++获取系统TCPUDP端口使用信息,并判断端口是否被占用(附源码)

被占用的端口如何通过Java代码查出是那个ip占用的

shell36判断8000端口是否被占用并杀死占用端口进程

如何查看端口被是不是被占用