Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 437|回复: 0

[网络编程学习]Java网络编程从入门到精通(15)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-5 00:03:47 | 显示全部楼层 |阅读模式
    在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中的connect方法并未提供这种方式,而是使用SocketAddress类来向connect方法传递服务器的IP和端口。虽然这种方式从表面上看要麻烦一些,但它会给我们带来另外一个好处,那就是网络地址的重用。

         所谓网络地址的重用表现在两个方面:

    1. 通过建立一个SocketAddress对象,可以在多次连接同一个服务器时使用这个SocketAddress对象。

    2. 在Socket类中提供了两个方法:getRemoteSocketAddress和getLocalSocketAddress,通过这两个方法可以得到服务器和本机的网络地址。而且所得到的网络地址在相应的Socket对象关闭后任然可以使用。下面是这两个方法的声明:

      
       
         
        public
         SocketAddress getRemoteSocketAddress()

        public
         SocketAddress getLocalSocketAddress()

       
      
       
       
         
       

         
       
      


           不管在使用Socket类连接服务器时是直接使用IP和端口,还是使用SocketAddress,这两个方法都返回SocketAddress形式的网络地址。当Socket对象未连接时这两个方法返回null,但要注意的是只有在Socket对象未连接时这两个方法才返回null,而当已经连接成功的Socket对象关闭后仍可使用这两个方法得到相应的网络地址。

         虽然上面曾多次提到SocketAddress,但SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因此,我们必须使用SocketAddress的子类来建立SocketAddress对象。在JDK1.4中J只为我们提供了IP网络地址的实现类:java.net.InetSocketAddress。这个类是从SocketAddress继承的,我们可以通过如下的方法来建立SocketAddress对象。




      
       
      SocketAddress socketAddress
      =
       
      new
       InetSocketAddress(host, ip);
      

    下面的代码演示了如何通过SocketAddress来共享网络地址:


      
       
      package
       mynet;


      import
       java.net.
      *
      ;


      public
       
      class
       MySocketAddress
    {
         
      public
       
      static
       
      void
       main(String[] args)
         {
             
      try
      
             {
                 Socket socket1
      =
       
      new
       Socket(
      "
      www.ptpress.com.cn
      "
      ,
      80
      );
                 SocketAddress socketAddress
      =
       socket1.getRemoteSocketAddress();
                 socket1.close();
                 Socket socket2
      =
       
      new
       Socket();
                
      //
       socket2.bind(new InetSocketAddress("192.168.18.252", 0));
      

                  socket2.connect(socketAddress);
                 socket2.close();
                 InetSocketAddress inetSocketAddress1
      =
       (InetSocketAddress) socketAddress;
                 System.out.println(
      "
      服务器域名:
      "
      
                                 
      +
       inetSocketAddress1.getAddress().getHostName());
                 System.out.println(
      "
      服务器IP:
      "
      
                                 
      +
       inetSocketAddress1.getAddress().getHostAddress());
                 System.out.println(
      "
      服务器端口:
      "
       
      +
       inetSocketAddress1.getPort());
                 InetSocketAddress inetSocketAddress2
      =
       (InetSocketAddress) socket2
                                 .getLocalSocketAddress();
                 System.out.println(
      "
      本地IP:
      "
      
                                 
      +
       inetSocketAddress2.getAddress().getLocalHost()
                                                 .getHostAddress());
                 System.out.println(
      "
      本地端口:
      "
       
      +
       inetSocketAddress2.getPort());
             }
             
      catch
       (Exception e)
             {
                 System.out.println(e.getMessage());
             }
         }
    }

      输出结果:



    服务器域名:www.ptpress.com.cn

    服务器IP:219.238.168.74

    服务器端口:80

    本地IP:192.168.18.253

    本地端口:4250



          如果多次运行例程4-10后,本地端口的值可能在每次都不一样。这是因为在socket2在连接时并未使用bind来绑定本地的端口,而这个本地端口是由系统在1024至65,535中随机选取的,因此,在每次运行程序时这个本地端口不一定相同。


    源码下载:http://file.javaxxz.com/2014/11/5/000347031.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 12:58 , Processed in 0.372449 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表