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

  • 相关阅读:
    Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
    java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
    Map集合应用 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
    Java中List集合排序的方法 比较器的使用 根据学生对象数学 语文 英语成绩总和进行sort排序
    美国银行
    Time Difference
    马来西亚与新加坡两国的标准时间为UTC+8
    java主要城市时区对照表
    韩国时区 KST
    AIX 系统
  • 原文地址:https://www.cnblogs.com/niujifei/p/14880349.html
Copyright © 2020-2023  润新知