Java 网络编程:(十四)总结

一、总结

  1、位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。

  2、客户端-服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。 端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。 套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。 TCP协议用于实现面向连接的会话。
  3、Java 中有关网络方面的功能都定义在 java.net 程序包中。 Java InetAddress 对象表示 IP地址,该对象里有两个字段:主机名(String) IP 地址(int)
  4、类 Socket ServerSocket 实现了基于TCP协议的客户端-服务器程序。 Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络
拥挤等问题,它保证数据可靠的传送。
  5、类 URL URLConnection 提供了最高级网络应用。 URL 的网络资源的位置来同一表示Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。

  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占用的资源,比如占用的本地端口号等。

原文地址:https://www.cnblogs.com/niujifei/p/14880349.html