java中如何判断端口被占用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何判断端口被占用相关的知识,希望对你有一定的参考价值。
是这样的的,我的这个类是使用的mina的SocketAcceptor做的这个服务器,要用到到一个端口,可无论启动多次,这个类,始终不报错,想找个通用的方法,在调用这个类之前判断下端口再启动,。。。。
参考技术A 楼主,经验告诉我们,只要使用的是同一端口,肯定会抛端口已经被绑定并使用的异常,不可能不报错的!除非是你把异常信息给去掉了,好好检查下你是否打印异常信息了吧。
有问题欢迎提问,满意请采纳!追问
实验告诉我,这个类确实没有抛异常。!
下面有个catch语句,可每次运行不报错,经过测试。只有一个端口在用,为什么不报错,就不得而知了,对这个mina不是很熟,
楼主,绑定监听端口请使用这个:
//绑定监听端口
acceptor.bind(new InetSocketAddress(端口号));
百分之百报错,你试试就知道了。
我下面还有一行,acceptor.bind();和你说的不一样?????但是就是不抛出异常1
追答有区别的。你试了就知道了。具体为什么不一样,你可以查阅相关资料就知道了。
参考技术B 如果有多个 IP 而你是使用机器名的话可以启动多次,如果是明确指定 IP 就会得到 Already bind exceptionVC++获取系统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中如何判断端口被占用的主要内容,如果未能解决你的问题,请参考以下文章