当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>JAVA网络编程

Java网络编程从入门到精通(25):创建ServerSocket对象

    ServerSocket类的构造方法有四种重载形式,它们的定义如下:

public  ServerSocket()  throws  IOException
public  ServerSocket( int  port)  throws  IOException
public  ServerSocket( int  port,  int  backlog)  throws  IOException
public  ServerSocket( int  port,  int  backlog, InetAddress bindAddr)  throws  IOException

    在上面的构造方法中涉及到了三个参数:port、backlog和bindAddr.其中port是ServerSocket对象要绑定的端口,backlog是请求队列的长度,bindAddr是ServerSocket对象要绑定的IP地址。

    一、通过构造方法绑定端口

    通过构造方法绑定端口是创建ServerSocket对象最常用的方式。可以通过如下的构造方法来绑定端口:

public  ServerSocket( int  port)  throws  IOException

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

    如果port的值为0,系统就会随机选取一个端口号。但随机选取的端口意义不大,因为客户端在连接服务器时需要明确知道服务端程序的端口号。可以通过ServerSocket的toString方法输出和ServerSocket对象相关的信息。下面的代码输入了和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(不是输出结果的port,是ServerSocket构造方法的参数port),localport是一个随机选取的端口号。

    在操作系统中规定1 ~ 1023为系统使用的端口号。端口号的最小值是1,最大值是65535.在Windows中用户编写的程序可以绑定端口号小于1024的端口,但在Linux/Unix下必须使用root登录才可以绑定小于1024的端口。在前面的文章中曾使用Socket类来判断本机打开了哪些端口,其实使用ServerSocket类也可以达到同样的目的。基本原理是用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  +   " 已经打开! " );
            }
    }
}

    在上面的代码中输出了创建ServerSocket对象时抛出的异常类的信息。ScanPort通过命令行参数将待扫描的端口号范围传入程序,参数格式为:minPort-maxPort,如果只输入一个端口号,ScanPort程序只扫描这个端口号。

    测试

java server.ScanPort  1 - 1023

    运行结果

class java.net.BindException
端口80已经打开!
class java.net.BindException
端口135已经打开!

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接