当前位置: 首页 > news >正文

Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)

  Java 类中,get ter和set ter方法占了很大的比重。由于Java 中没有定义属性的关键字;因此,get ter和set ter方法用于获得和设置Java 类的属性值; getName setName方法用于设置name属性的值 。如果某个属性只有get ter方法,那这个属性是只读的;如果只有set ter方法,那么这个属性是只写的。在Socket 类中也有很多这样的属性来获得和Socket 相关的信息,以及对Socket 对象的状态进行设置。
一、 用于获得信息的 getter 方法
我们可以从Socket 对象中获得3 种信息。
1.  服务器信息
对于客户端来说,服务器的信息只有两个:IP 和端口。Socket 类为我们提供了3 个方法来得到这两个信息。
(1) public InetAddress getInetAddress()
这个方法返回一个InetAddress 对象。通过这个对象,可以得到服务器的IP 、域名等信息。
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );
System.out.println(socket.getInetAddress().getHostAddress());
System.out.println(socket.getInetAddress().getHostName());

(2) public int getPort()
这个方法可以以整数形式获得服务器的端口号。
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );
System.out.println(socket.getInetAddress().getPort());
    (3) public SocketAddress getRemoteSocketAddress()
这个方法是将getInetAddress getPort方法 结合在了一起;利用这个方法可以同时得到服务器的IP 和端口号。但这个方法返回了一个SocketAddress 对象,这个对象只能作为connect 方法的参数用于连接服务器;而要想获得服务器的IP 和端口号,必须得将SocketAddress 转换为它的子类InetSocketAddress
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );    
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getPort());
注意:以上3个方法都可以在调用Socket对象关闭后调用。它们所获得的信息在Socket对象关闭后仍然有效。如果直接使用IP连接服务器时,getHostName和getHostAddress的返回值是一样的;都是服务器的IP。
2. 本机信息
与服务器信息一样,本机信息也有两个:本地IP 和绑定的本地端口号。这些信息也可以通过3 个方法来获得。
(1) public InetAddress getLocalAddress()
这个方法返回了本机的InetAddress 对象。通过这个方法可以得到本机的IP 和机器名。当本机绑定了多个IP 时,Socket 对象使用哪一个IP 连接服务器,就返回哪个IP 。如果本机使用ADSL 上网,并且通过Socket 对象连接到Internet 上的某一个IP 或域名上(如www.ptpress.com.cn ),则getLocalAddress 将返回“ADSL 连接所临时绑定的IP ;因此,我们可以通过getLocalAddress 得到ADSL 的临时IP
Socket socket  =   new  Socket();
socket.connect(
new  InetSocketAddress( " www.ptpress.com.cn " 80 ));
System.out.println(socket.getLocalAddress().getHostAddress());
System.out.println(socket.getLocalAddress().getHostName());
(2) public int getLocalPort()
通过这个方法可以得到Socket 对象所绑定的本机的一个端口号;如果未绑定端口号,则返回一个从1024 65,535 之间的随机数。因此,使用这个方法可能每次得到的端口号不一样。
Socket socket  =   new  Socket();
//  如果使用下面的bind方法进行端口绑定的话,getLocalPort方法将返回100
//  socket.bind(new InetSocketAddress("127.0.0.1", 100));
socket.connect( new  InetSocketAddress( " www.ptpress.com.cn "   80 ));
System.out.println(socket.getLocalPort())
   (3) public SocketAddress getLocalSocketAddress()
这个方法和getRemoteSocketAddress 方法类似,也是同时得到了本地IP Socket 对象所绑定的端口号。如果要得到本地IP 和端口号,必须将这个方法的返回值转换为InetSocketAddress 对象。
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );    
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getHostName());       
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getPort());
3. 用于传输数据的输入、输出流
输入、输出流在前面的章节已经被多次用到。在这里让我们来简单回顾一下。
(1) public InputStream getInputStream() throws IOException
用于获得从服务器读取数据的输入流。它所得以的流是最原始的源。为了操作更方便,我们经常使用InputStreamReader BufferedReader 来读取从服务器传过来的字符串数据。
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );
InputStream inputStream 
=  socket.getInputStream();
InputStreamReader inputStreamReader 
=   new  InputStreamReader(inputStream);
BufferedReader bufferedReader 
=   new  BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
(2) public OutputStream getOutputStream() throws IOException
用于获得向服务器发送数据的输出流。输出流可以通过OutputStreamWriter BufferedWriter 向服务器写入字符串数据。
Socket socket  =   new  Socket( " www.ptpress.com.cn " 80 );
OutputStream outputStream  
=  socket.getOutputStream();        
OutputStreamWriter outputStreamWriter 
=   new  OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter 
=   new  BufferedWriter(outputStreamWriter);
bufferedWriter.write(
" 你好 " );
bufferedWriter.flush();
注意:在使用OutputStream的write方法输出数据后,必须使用flush方法刷新输出缓冲区,以便将输出缓冲区中的数据发送出去。如果要输出字符串,使用OutputStreamWriter和BufferedWriter都可以;它们的write方法都可以直接使用字符串作为参数来输出数据。而这一点与相应的InputStreamReader和BufferedReader不同;它们中只有BufferedReader有readLine方法,因此,必须使用BufferedReader才能直接读取字符串数据。
 
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

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

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

相关文章:

  • 最新Mysql中文帮助
  • Vista Sidebar Gadget (侧边栏小工具)开发教程 (3)
  • C++中方法定义和调用需要注意的一个地方
  • 在局域网里上网时总是弹出宽带连接的窗口
  • ExtJS学习之ComboBox
  • 书签
  • 如何实现以root身份telnet连接rhel服务器?
  • mhdd应用详解-入门篇(图文教程)
  • 菜鸟学Linux之六:samba服务的搭建与部署
  • Netcat
  • 表达式求值组件Jeval
  • “U盘大盗”让你的U盘防不胜防###
  • 我的耳朵
  • [转载]【Java EE】Struts2.1.6+Spring2.5.6+Hibernate3.3.1框架 整合开发
  • 关于SQL SERVER 日志满的处理方法
  • 【个人向】《HTTP图解》阅后小结
  • co.js - 让异步代码同步化
  • EOS是什么
  • gops —— Go 程序诊断分析工具
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Linux中的硬链接与软链接
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring Boot快速入门(一):Hello Spring Boot
  • tab.js分享及浏览器兼容性问题汇总
  • Web设计流程优化:网页效果图设计新思路
  • 前端设计模式
  • 一些css基础学习笔记
  • 我们雇佣了一只大猴子...
  • ​业务双活的数据切换思路设计(下)
  • #if 1...#endif
  • $(selector).each()和$.each()的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (31)对象的克隆
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)共用体union的用法举例
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)linux使用docker容器运行mysql
  • (附源码)计算机毕业设计大学生兼职系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • .md即markdown文件的基本常用编写语法
  • .net MVC中使用angularJs刷新页面数据列表
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .net反编译工具
  • .NET中 MVC 工厂模式浅析
  • .net中的Queue和Stack
  • @ModelAttribute使用详解
  • @synthesize和@dynamic分别有什么作用?
  • @vue/cli 3.x+引入jQuery
  • @vue/cli脚手架
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [04]Web前端进阶—JS伪数组
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)