Java程序可以非常方便的访问互联网上的 HTTP 服务、FTP 服务等,并可以直接取得互联网上的远程资源,还可以向远程资源发送 GET、POST 请求。
一、InetAddress 类
此类表示互联网协议(IP)地址,它有两个子类 Inet4Address 和 Inet6Address,分别对应IPV4和IPV6。InetAddress 类没有提供公共的构造器,而是提供了几个静态方法来获取 InetAddress 实例。
获取InetAddress实例方法:
static InetAddress getLocalHost() :返回本地主机。
static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址
static InetAddress getByAddress(byte[] addr) :在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host, byte[] addr) :根据提供的主机名和 IP 地址创建 InetAddress
static InetAddress[] getAllByName(String host):在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组
常用方法:
public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。
public String getHostName():获取此 IP 地址的主机名
public String getCanonicalHostName():获取此 IP 地址的完全限定域名
public boolean isReachable(int timeout):测试是否可以达到该地址。
public byte[] getAddress() :返回此 InetAddress 对象的原始 IP 地址
Demo:
1 public class TestInetAddress {
2 public static void main(String[] args) throws Exception{
3 InetAddress ip1 = InetAddress.getLocalHost();
4 System.out.println(ip1);//njf/192.168.233.1
5
6 InetAddress ip2 = InetAddress.getByName("www.baidu.com");
7 System.out.println(ip2);//www.baidu.com/182.61.200.6
8
9 byte[] ip = {(byte)182,61,(byte)200,6};
10 InetAddress ip3 = InetAddress.getByAddress(ip);
11 //输出ip而不是域名。如果这个IP地址不存在或DNS服务器不允许进行ip-->域名的映射,getHostName()方法就直接返回这个IP地址
12 System.out.println(ip3);
13 }
14 }
二、URL
URI(Uniform resource identifier):表示一个统一资源标识符 (URI) 引用,用来唯一的标识一个资源。
URL(Uniform Resource Locator):类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URI不能用于定位任何资源,它的唯一作用是解析,而URL则包含一个可打开到达该资源的输入流。
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名
<传输协议>://<主机名>:<端口号>/<文件名>?参数列表
其中 # 片段名: 即锚点
例如:http://java.sun.com/index.html#chapter1
参数列表格式:参数名=参数值&参数名=参数值....
例如:http://192.168.1.100:8080/helloworld/index.jsp?username=chai&password=123
URL构造方法:
public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象
public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象
URL(String protocol, String host, String file) :根据指定的 protocol 名称、host 名称和 file 名称创建 URL
URL(String protocol, String host, int port, String file):根据指定 protocol、host、port 号和 file 创建 URL 对象
Demo:
1 URL url = new URL ("http://www.baidu.com/");
2 URL downloadUrl = new URL(url, "download.html");
3 URL url2 = new URL("http", "www.baidu.com", “download. html");
4 URL gamelan = new URL("http", "www.baidu.com", 80, “download.html");
URL常用方法:
public String getProtocol():获取该URL的协议名
public String getHost():获取该URL的主机名
public String getPort():获取该URL的端口号
public String getPath():获取该URL的文件路径,即tomcat的webapps目录下级目录名也就是资源路径名
public String getFile():获取该URL的文件名
public String getRef():获取该URL在文件中的相对位置
public String getQuery():获取该URL的查询名
public final InputStream openStream():返回一个用于从该连接读入的 InputStream。
public Object getContent():获取次 URL 的内容
Demo1:
1 import java.net.MalformedURLException;
2 import java.net.URL;
3
4 public class TestURL {
5 public static void main(String[] args) throws MalformedURLException {
6 URL url = new URL("http://www.baidu.com:80/index.html?keyword=java");
7 System.out.println("协议:" + url.getProtocol()); //协议:http
8 System.out.println("主机名:" + url.getHost()); //主机名:www.baidu.com
9 System.out.println("端口号:" + url.getPort()); //端口号:80
10 System.out.println("路径名:" + url.getPath()); //路径名:/index.html
11 System.out.println("文件名:" + url.getFile()); //文件名:/index.html?keyword=java
12 //注意如果存在锚点,那么查询名返回null,因为#后面全部当做锚点了
13 System.out.println("锚点:" + url.getRef()); //锚点:null
14 System.out.println("查询名:" + url.getQuery()); //查询名:keyword=java
15 }
16 }
Demo2:
1 import java.io.InputStream;
2 import java.net.URL;
3
4 public class TestURLRead {
5 public static void main(String[] args)throws Exception {
6 URL url = new URL("http://www.baidu.com/index.html");
7 /*html标签(格式化数据)、css:皮肤(美化数据)、js:互动(交互数据)、数据:*/
8 InputStream input = url.openStream();
9 byte[] data = new byte[1024];
10 int len;
11 while((len=input.read(data))!=-1){
12 System.out.println(new String(data,0,len,"UTF-8"));
13 }
14 input.close();
15 }
16 }
三、URLConnection
URL的方法openStream(),能从网络上读取数据,但是无法给服务器端发送数据,若希望给服务器端发送数据,则需要URLConnection。
它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:
1. 通过 URL 对象调用 openConnection 方法创建 URLConnection 对象;
2. 处理设置参数和一般请求属性;
3. 使用 connect 方法建立到远程对象的实际连接;
4. 远程对象变为可用,远程对象的头字段和内容变为可访问。
常用方法:
public void setDoOutput(boolean dooutput)如果打算使用 URL 连接进行输出,例如给服务器传递请求参数,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false。 必须在所有getXXX()和connect()方法之前。
public String getContentEncoding():返回 content-encoding 头字段的值。
public int getContentLength():返回 content-length 头字段的值。
public String getContentType():返回 content-type 头字段的值。
public long getDate():返回 date 头字段的值。
public long getLastModified():返回 last-modified 头字段的值。结果为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。
public String getHeaderField(String name):返回指定的头字段的值。
public InputStream getInputStream()返回从此打开的连接读取的输入流。
public OutputStream getOutputStream()返回写入到此连接的输出流。
Demo:
1 import java.io.BufferedReader;
2 import java.io.InputStream;
3 import java.io.InputStreamReader;
4 import java.net.URL;
5 import java.net.URLConnection;
6
7 public class TestURLConnection {
8 public static void main(String[] args) throws Exception{
9 URL url = new URL("http://localhost/web1/login");
10 //通过 URL对象调用 openConnection 方法创建URLConnection连接对象
11 URLConnection uc = url.openConnection();
12 //处理设置参数
13 uc.setDoOutput(true);
14 //给服务器发送请求参数
15 uc.getOutputStream().write("username=admin&password=123".getBytes());
16 //使用 connect 方法建立到远程对象的实际连接。
17 uc.connect();
18 //获取资源
19 InputStream is = uc.getInputStream();
20 BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
21 String str;
22 while((str=br.readLine())!=null){
23 System.out.println(str);
24 }
25 br.close();
26 }
27 }
四、Socket
通信的两端都要有Socket(也可以叫“套接字”),是两台机器间通信的端点。可以和网卡驱动进行交流,负责把数据交给网卡驱动,或者从网卡驱动中提取数据。网络通信其实就是Socket间的通信。
Socket 可分为:
- 流套接字(stream socket):使用 TCP 提供可依赖的字节流服务(ServerSocket类和Socket类)
- 数据包套接字(datagram socket):使用 UDP 提供“尽力而为” 的数据报服务(DatagramSocket类)
Socket 类的常用构造方法:
public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket 类的常用方法:
public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
public InetAddress getInetAddress():此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。
public InetAddress getLocalAddress():获取套接字绑定的本地地址。
public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。
public int getLocalPort():返回此套接字绑定到的本地端口。如果尚未绑定套接字,则返回 -1。
public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。
public void shutdownInput():如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。
public void shutdownOutput():禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。
注意:
先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等于调用Socket的close()方法。在通信结束后,仍然要调用Scoket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口号等。