`
JMaCan
  • 浏览: 14440 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

ServerSocket通过构造方法绑定端口

阅读更多

通过构造方法绑定端口是创建ServerSocket对象最常用的方式:

public ServerSocket(int port) throws IOException

 

如果port参数所指定的端口已经被绑定,构造方法就会抛出IOException异常,但实际上抛出的异常是BindException。因为和网络有关的异常都是IOException类的子类,为了ServerSocket构造方法还可以抛出其他的异常,就使用了IOException。

 

如果port的值为0,系统就会随机选取一个端口号,但随机选取的端口意义不大,因为客户端在连接服务器时需要明确知道服务端程序的端口号。可以通过ServerSocket的toString方法输出和ServerSocket对象相关的信息。

ServerSocket serverSocket = new ServerSocket(1320);
System.out.println(serverSocket);

运行结果:

ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=1320]

 

 

 

addr是服务端绑定的IP地址,如果未绑定IP地址,这个值是0.0.0.0,在这种情况下,ServerSocket对象将监听服务端所有网络接口的所有IP地址;port永远是0;localport是ServerSocket绑定的端口,如果参数port值为0,localport是一个随机选取的端口号。

 

在操作系统中规定1 ~ 1023为系统使用的端口号。端口号的最小值是1,最大值是65535。在Windows中用户编写的程序可以绑定端口号小于1024的端口,但在Linux/Unix下必须使用root登录才可以绑定小于1024的端口。

 

判断本机打开了哪些端口:基本原理是用ServerSocket来绑定本机的端口,如果绑定某个端口时抛出BindException异常,就说明这个端口已经打开,反之则这个端口未打开。

 

package server;

import java.net.*;

public class ScanPort
{
    
public static void main(String[] args)
    {
        
if (args.length == 0)
            
return;
        
int minPort = 0, maxPort = 0;
        String ports[] 
= args[0].split("[-]");
        minPort 
= Integer.parseInt(ports[0]);
        maxPort 
= (ports.length > 1? Integer.parseInt(ports[1]) : minPort;
        
for (int port = minPort; port <= maxPort; port++)
            
try
            {
                ServerSocket serverSocket 
= new ServerSocket(port);
                serverSocket.close();
            }
            
catch (Exception e)
            {
                System.err.println(e.getClass());
                System.err.println(
"端口" + port + "已经打开!");
            }
    }
}

 

测试:

java server.ScanPort 1-1023

测试结果:

class java.net.SocketException
端口135已经打开!
class java.net.SocketException
端口445已经打开!
class java.net.SocketException
端口554已经打开!

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics