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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!上一篇:Java网络编程从入门到精通(14):多种多样的建立网络连接的方式     在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中的connect方法并未提供这种方式,而是使用SocketAddress类来向connect方法传递服务器的IP和端口。
本文为原创,如需转载,请注明作者和出处,谢谢!

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

    在使用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网络编程从入门到精通(16):客户端套接字(Socket)的超时

国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
20天前
|
关系型数据库 Java 开发工具
Java入门高频考查基础知识9(15问万字参考答案)
本文探讨了Spring Cloud的工作原理,包括注册中心的心跳机制、服务发现机制,以及Eureka默认的负载均衡策略。同时,概述了Spring Boot中常用的注解及其实现方式,并深入讨论了Spring事务的注解、回滚条件、传播性和隔离级别。文章还介绍了MySQL的存储引擎及其区别,特别关注了InnoDB如何实现MySQL的事务处理。此外,本文还详细探讨了MySQL索引,包括B+树的原理和设计索引的方法。最后,比较了Git和SVN的区别,并介绍了Git命令的底层原理及流程。
29 0
Java入门高频考查基础知识9(15问万字参考答案)
|
20天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
46 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
20天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
32 0
|
20天前
|
存储 Java 编译器
Java入门高频考查基础知识2(超详细28题2.5万字答案)
多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息作出不同的响应。在具体实现上,多态允许一个父类的引用指向其子类的对象,并根据实际指向的对象的类型来调用相应的方法。在 Java 中,多态可以通过以下几种方式实现:在同一个类中,方法名相同,但形参列表不同,实现了多态。子类可以重写(覆盖)其父类的方法,实现多态。在父类引用中调用该方法时,根据实际指向的子类对象的类型来调用相应的方法实现。
38 0
|
21天前
|
编解码 算法 安全
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
44 0
|
29天前
|
网络协议 安全 Java
Java网络编程
Java网络编程
|
网络协议 Java API
|
缓存 网络协议 Java