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

Java网络编程从入门到精通(15):为什么要使用SocketAddress来管理网络地址相关推荐

  1. java消息头,Java网络编程从入门到精通:HTTP消息头字段

    Java网络编程从入门到精通:HTTP消息头字段 一.通用头字段 1. Connection 这个字段只在HTTP1.1协议中存在.它决定了客户端和服务器进行了一次会话后, 服务器是否立即关闭网络连接 ...

  2. Java网络编程从入门到精通(1):Internet地址概述

    所有连入Internet的终端设备(包括计算机.PDA.打印机以及其他的电子设备)都有一个唯一的索引,这个索引被称为IP地址.现在Internet上的IP地址大多由四个字节组成,这种IP地址叫做IPv ...

  3. Java网络编程从入门到精通(14):多种多样的建立网络连接的方式

    在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器.而为了使连接服务器的方式更灵活,Socke ...

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

    ServerSocket类的构造方法有四种重载形式,它们的定义如下: public ServerSocket() throws IOException public ServerSocket(int  ...

  5. Java网络编程从入门到精通 (9):使用isXxx方法判断地址类型

     IP地址分为普通地址和特殊地址.在前面的文章中所使用的大多数都是普通的IP地址,在本文中将介绍如何利用InetAddress类提供的十个方法来确定一个IP地址是否是一个特殊的IP地址. 一.isAn ...

  6. Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)

    源代码下载:download.rar 在前面的文章曾讨论了HTTP消息头的三个和断点继传有关的字段.一个是请求消息的字段Range,另两个是响应消息字段Accept-Ranges和Content-Ra ...

  7. Java网络编程从入门到精通(4):DNS缓存

    在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作.在Java中为了缓解这个问题,提供了DNS缓存.当InetAddress ...

  8. Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法

    InetAddress类是Java中用于描述IP地址的类.它在java.net包中.在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址.这两个类都是I ...

  9. Java网络编程从入门到精通(3):为什么不能直接通过IP访问网站

     在<创建InetAdrress对象的四个静态方法>一文中通过getAllByName得到了www.csdn.net对应的四个IP地址.从理论上说,在IE(或其他的Web浏览器,如Fire ...

  10. Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址

     这个方法用来得到主机的IP地址,这个IP地址可能是IPv4的地址,也可能是IPv6的地址.getHostAddress方法的定义如下: public String getHostAddress() ...

最新文章

  1. matlab 报错 javax,[求助]安装报错,求大佬帮忙
  2. 百度搜索关键字如何排名?“网站SEO”告诉你答案
  3. CentOS上使用libtld
  4. DataParallel 和 DistributedDataParallel 的区别和使用方法
  5. eigen库学习笔记(2)
  6. NAT和代理服务器的调研
  7. 离子交换树脂工艺解决电脑印刷线路板废水镍超标
  8. Python实现自己的分布式区块链视频教程-张敏-专题视频课程
  9. 修改系统UISearchBar搜索框的样式-搜索图片、背景颜色
  10. 解决端口占用问题 Port xxxx was already in use
  11. 免费获取全球生物量密度1km网格tif数据(GEDI L4B Gridded Aboveground Biomass Density, Version 2)
  12. centos7.x 搭建php运行环境
  13. 计算机应用基础00018课件
  14. 苹果Mac 30周年:那些改变世界的人和Mac电脑
  15. 【公示】关于举办“元宇宙数字人制作竞赛”的复函
  16. 2022R2移动式压力容器充装考试题及答案
  17. TCP面向连接中的“连接”究竟是什么,可靠与不可靠
  18. MySQL使用profile分析语句性能消耗
  19. H5微信公众号开发,微信支付
  20. 根据先序和中序求后序,注意递归终止条件

热门文章

  1. 9.11排序与查找(二)——对字符串数组进行排序,将全部的变位词排在相邻的位置...
  2. 在exe运行界面按右键(不用按鼠标右键)
  3. SQL Server提取字段中的所有数字
  4. WindowsServer2003 MSSQL安全
  5. 应用程序偏好设置(转)
  6. git bash上传代码到github
  7. Javascript作用域、闭包原理以及性能问题
  8. fgets和fgetl有什么区别
  9. FabFilter Total Bundle 2021 for Mac - 经典效果器合集(2022版)
  10. 在 Mac上手动清除应用程序/用户缓存教程