zoukankan      html  css  js  c++  java
  • Java网络编程从入门到精通(15):为什么要使用SocketAddress来管理网络地址

    在使用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中随机选取的,因此,在每次运行程序时这个本地端口不一定相同。

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/woshixiaobai/p/4264166.html
Copyright © 2011-2022 走看看