`
seara
  • 浏览: 625580 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

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

在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中的connect方法并未提供这种方式,而是使用SocketAddress类来向connect方法传递服务器的IP和端口。虽然这种方式从表面上看要麻烦一些,但它会给我们带来另外一个好处,那就是网络地址的重用。
所谓网络地址的重用表现在两个方面:

1. 通过建立一个SocketAddress对象,可以在多次连接同一个服务器时使用这个SocketAddress对象。
2. 在Socket类中提供了两个方法:getRemoteSocketAddress和getLocalSocketAddress,通过这两个方法可以得到服务器和本机的网络地址。而且所得到的网络地址在相应的Socket对象关闭后任然可以使用。下面是这两个方法的声明:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicSocketAddressgetRemoteSocketAddress()
publicSocketAddressgetLocalSocketAddress()

不管在使用Socket类连接服务器时是直接使用IP和端口,还是使用SocketAddress,这两个方法都返回SocketAddress形式的网络地址。当Socket对象未连接时这两个方法返回null,但要注意的是只有在Socket对象未连接时这两个方法才返回null,而当已经连接成功的Socket对象关闭后仍可使用这两个方法得到相应的网络地址。
虽然上面曾多次提到SocketAddress,但SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因此,我们必须使用SocketAddress的子类来建立SocketAddress对象。在JDK1.4中J只为我们提供了IP网络地址的实现类:java.net.InetSocketAddress。这个类是从SocketAddress继承的,我们可以通过如下的方法来建立SocketAddress对象。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SocketAddresssocketAddress=newInetSocketAddress(host,ip);

下面的代码演示了如何通过SocketAddress来共享网络地址:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package mynet;

importjava.net.*;

publicclass MySocketAddress
{
publicstaticvoidmain(String[]args)
{
try
{
Socketsocket1
=newSocket("www.ptpress.com.cn",80);
SocketAddresssocketAddress
=socket1.getRemoteSocketAddress();
socket1.close();
Socketsocket2
=newSocket();
//socket2.bind(newInetSocketAddress("192.168.18.252",0));
socket2.connect(socketAddress);
socket2.close();
InetSocketAddressinetSocketAddress1
=(InetSocketAddress)socketAddress;
System.out.println(
"服务器域名:"
+inetSocketAddress1.getAddress().getHostName());
System.out.println(
"服务器IP:"
+inetSocketAddress1.getAddress().getHostAddress());
System.out.println(
"服务器端口:"+inetSocketAddress1.getPort());
InetSocketAddressinetSocketAddress2
=(InetSocketAddress)socket2
.getLocalSocketAddress();
System.out.println(
"本地IP:"
+inetSocketAddress2.getAddress().getLocalHost()
.getHostAddress());
System.out.println(
"本地端口:"+inetSocketAddress2.getPort());
}
catch(Exceptione)
{
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开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Java+TCP/IP+Socket编程 原书第2版

    然而,自2001年以来,Java的网络编程能力已经得到了很大程度的扩展,而且 持续的应用优势已经使其成为了一个占主导地位的平台。考虑到Java受欢迎程度和近期在形式 上和功能上令人兴奋的创新,本书的新版涵盖了Java的...

    Java TCP/IP Socket编程 原书第2版

    本书的新版涵盖了Java的当前最新版本的内容(7.5版至1.7版),以及一些新的重要的抽象,包括NetworkInterface,InterfaceAddress,Inet4/6Address抽象、SocketAddress InetSocketAddressf1]Executor等。现在几乎...

    Z00433 Java TCP IP Socket编程 原书第2版

    然而,自2001年以来,Java的网络编程能力已经得到了很大程度的扩展,而且持续的应用优势已经使其成为了一个占主导地位的平台。考虑到Java受欢迎程度和近期在形式上和功能上令人兴奋的创新,本书的新版涵盖了Java的...

    junixsocket:Java中的Unix域套接字(AF_UNIX)

    为什么很酷junixsocket是一个小型的模块化库。 仅安装您需要的内容。 与其他实现相反, junixsocket扩展了Java Sockets API( java.net.Socket , java.net.SocketAddress等)。 通过AF_UNIX支持RMI 。 数据库支持...

    secs4java8:该库是Java8上的SEMI-SECS通讯实现

    secs4java8 介绍 该库是Java8上SEMI-SECS通讯的实现。 技术支持 SECS-I(SEMI-E4) SECS-II(SEMI-E5) 创业板(SEMI-E30,部分) HSMS-SS(SEMI-E37.1) 创建Communicator实例并打开 对于使用HSMS-SS-Passive...

    Java NIO 聊天室 JSwing

    //selector的wakeup方法被调用,方法返回,而对于客户端来说,通道一直是被选中的 selector.select(); // 获得selector中选中的项的迭代器 Iterator ite = this.selector.selectedKeys().iterator(); while...

    java 大一课程设计 qq聊天程序

    java 大一课程设计 qq聊天程序socket=new Socket(); textPanel.send.setEnabled(false); thread=new Thread(this); setVisible(true); validate(); } public void actionPerformed(ActionEvent e) { ...

    python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

    UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议。在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议。 下面是用python实现...

    tinyredis:基于hiredis的简单Java redis客户端

    小Redis 基于hiredis的简单Java redis客户端tinyredis 相对于其他 Java 客户端的优势在于其简单性提供的灵活性。 客户端与所使用的 redis 版本无关,并且不需要升级,因为在服务器上实现了新的命令和功能。 在掌握了...

    Socket通信下载文件

    android客户端利用sokcet通信和向Java服务端发请求,Java服务端把文件发给android客户端

    TCP-IP Sockets in Java. Practical Guide for Programmers

    The networking capabilities of the Java platform have been extended considerably since the first edition of the book. This new edition covers version 1.5-1.7, the most current iterations, as well as ...

    netty-server中采用的分包拆包源码,java开发用于实战项目

    @Component public class RabbitmqConfig { private final static String message = "web.socket.message";...完整代码,下载有详细说明,使用于长报文通讯,将报文长度截取一定字节发送,便于网速传输中丢包

    network-packet-linux:Haskell软件包,用于与AF_PACKET套接字一起使用

    网络包Linux 该软件包提供的类型可以使network软件包与Linux数据包套接字一起使用。 数据包套接字在进行了描述。 从版本3.0.0开始,程序包提供了一个 ,该是根据SocketAddress类型类实现的。 network-packet-linux...

    podasync:Fanap的POD异步服务(DIRANA)

    Websocket协议参数var params = { socketAddress : "ws://chat-sandbox.pod.land/ws" , serverName : "chat-server" , reconnectOnClose : true , connectionCheckTimeout : 10000 , asyncLogging : { onFunction : ...

    netty-debug:自己的debug的netty源码,用于后续查看曾经写过的注释

    public Bootstrap resolver( AddressResolverGroup&lt;?&gt;... 您需要以下内容来构建Netty: 最新稳定的 最新稳定的 如果您使用的是Linux,则需要在系统上安装,因为您将构建本机传输。 请注意,这

Global site tag (gtag.js) - Google Analytics