Java网络编程从入门到精通(15):为什么要使用SocketAddress来管理网络地址
所谓网络地址的重用表现在两个方面:
1. 通过建立一个SocketAddress对象,可以在多次连接同一个服务器时使用这个SocketAddress对象。
2. 在Socket类中提供了两个方法:getRemoteSocketAddress和getLocalSocketAddress,通过这两个方法可以得到服务器和本机的网络地址。而且所得到的网络地址在相应的Socket对象关闭后任然可以使用。下面是这两个方法的声明:
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来共享网络地址:
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来管理网络地址相关推荐
- java消息头,Java网络编程从入门到精通:HTTP消息头字段
Java网络编程从入门到精通:HTTP消息头字段 一.通用头字段 1. Connection 这个字段只在HTTP1.1协议中存在.它决定了客户端和服务器进行了一次会话后, 服务器是否立即关闭网络连接 ...
- Java网络编程从入门到精通(1):Internet地址概述
所有连入Internet的终端设备(包括计算机.PDA.打印机以及其他的电子设备)都有一个唯一的索引,这个索引被称为IP地址.现在Internet上的IP地址大多由四个字节组成,这种IP地址叫做IPv ...
- Java网络编程从入门到精通(14):多种多样的建立网络连接的方式
在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器.而为了使连接服务器的方式更灵活,Socke ...
- Java网络编程从入门到精通(25):创建ServerSocket对象
ServerSocket类的构造方法有四种重载形式,它们的定义如下: public ServerSocket() throws IOException public ServerSocket(int ...
- Java网络编程从入门到精通 (9):使用isXxx方法判断地址类型
IP地址分为普通地址和特殊地址.在前面的文章中所使用的大多数都是普通的IP地址,在本文中将介绍如何利用InetAddress类提供的十个方法来确定一个IP地址是否是一个特殊的IP地址. 一.isAn ...
- Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)
源代码下载:download.rar 在前面的文章曾讨论了HTTP消息头的三个和断点继传有关的字段.一个是请求消息的字段Range,另两个是响应消息字段Accept-Ranges和Content-Ra ...
- Java网络编程从入门到精通(4):DNS缓存
在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作.在Java中为了缓解这个问题,提供了DNS缓存.当InetAddress ...
- Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法
InetAddress类是Java中用于描述IP地址的类.它在java.net包中.在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址.这两个类都是I ...
- Java网络编程从入门到精通(3):为什么不能直接通过IP访问网站
在<创建InetAdrress对象的四个静态方法>一文中通过getAllByName得到了www.csdn.net对应的四个IP地址.从理论上说,在IE(或其他的Web浏览器,如Fire ...
- Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
这个方法用来得到主机的IP地址,这个IP地址可能是IPv4的地址,也可能是IPv6的地址.getHostAddress方法的定义如下: public String getHostAddress() ...
最新文章
- matlab 报错 javax,[求助]安装报错,求大佬帮忙
- 百度搜索关键字如何排名?“网站SEO”告诉你答案
- CentOS上使用libtld
- DataParallel 和 DistributedDataParallel 的区别和使用方法
- eigen库学习笔记(2)
- NAT和代理服务器的调研
- 离子交换树脂工艺解决电脑印刷线路板废水镍超标
- Python实现自己的分布式区块链视频教程-张敏-专题视频课程
- 修改系统UISearchBar搜索框的样式-搜索图片、背景颜色
- 解决端口占用问题 Port xxxx was already in use
- 免费获取全球生物量密度1km网格tif数据(GEDI L4B Gridded Aboveground Biomass Density, Version 2)
- centos7.x 搭建php运行环境
- 计算机应用基础00018课件
- 苹果Mac 30周年:那些改变世界的人和Mac电脑
- 【公示】关于举办“元宇宙数字人制作竞赛”的复函
- 2022R2移动式压力容器充装考试题及答案
- TCP面向连接中的“连接”究竟是什么,可靠与不可靠
- MySQL使用profile分析语句性能消耗
- H5微信公众号开发,微信支付
- 根据先序和中序求后序,注意递归终止条件
热门文章
- 9.11排序与查找(二)——对字符串数组进行排序,将全部的变位词排在相邻的位置...
- 在exe运行界面按右键(不用按鼠标右键)
- SQL Server提取字段中的所有数字
- WindowsServer2003 MSSQL安全
- 应用程序偏好设置(转)
- git bash上传代码到github
- Javascript作用域、闭包原理以及性能问题
- fgets和fgetl有什么区别
- FabFilter Total Bundle 2021 for Mac - 经典效果器合集(2022版)
- 在 Mac上手动清除应用程序/用户缓存教程