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开发速学宝典》出版,欢迎定购

目录
相关文章
|
10天前
|
监控 安全 数据安全/隐私保护
智能家居安全入门:保护你的网络家园
本文旨在为初学者提供一份简明扼要的指南,介绍如何保护自己的智能家居设备免受网络攻击。通过分析智能家居系统常见的安全漏洞,并提供实用的防御策略,帮助读者建立起一道坚固的数字防线。
|
8天前
|
网络协议 安全 网络安全
C语言 网络编程(四)常见网络模型
这段内容介绍了目前被广泛接受的三种网络模型:OSI七层模型、TCP五层模型以及TCP/IP四层模型,并简述了多个网络协议的功能与特性,包括HTTP、HTTPS、FTP、DNS、SMTP、TCP、UDP、IP、ICMP、ARP、RARP及SSH协议等,同时提到了ssh的免费开源实现openssh及其在Linux系统中的应用。
|
11天前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
50 6
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
8 0
|
11天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
32 0
|
11天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
31 0
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
11天前
|
Java 程序员 UED
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习入门:使用Python和TensorFlow构建你的第一个神经网络
【8月更文挑战第31天】 本文是一篇面向初学者的深度学习指南,旨在通过简洁明了的语言引导读者了解并实现他们的第一个神经网络。我们将一起探索深度学习的基本概念,并逐步构建一个能够识别手写数字的简单模型。文章将展示如何使用Python语言和TensorFlow框架来训练我们的网络,并通过直观的例子使抽象的概念具体化。无论你是编程新手还是深度学习领域的新兵,这篇文章都将成为你探索这个激动人心领域的垫脚石。
|
11天前
|
机器学习/深度学习 自动驾驶 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】 本文旨在通过浅显易懂的方式,引导初学者步入卷积神经网络(CNN)的神秘世界。我们将从CNN的基础概念出发,逐步深入到其在图像处理中的应用实例,最后通过一个简单的Python代码示例,展示如何实现一个基础的CNN模型。无论你是编程新手还是深度学习领域的初探者,这篇文章都将为你打开一扇了解和掌握CNN的大门。