javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)

通过一段时间对java网络编程相关内容的学习,写下这篇随笔,对这一部分的知识进行梳理和总结。

网络编程

一、网络编程三要素:

  IP地址:网络会给每个联网的主机分配一个数字的编码地址,该地址就是IP地址(本地回送地址,Localhost:127.0.0.1)。
      IPV4, IPV6 ,
      MAC地址:每个主机在出厂前(网卡),都会被分配一个数字地址,改地址对应所有网卡具有唯一性,就叫做MAC地址(物理地址)。

  网络端口:每个程序都有一个数字的标示,以使得数据在传输的时候能够识别对应的程序,该数字就叫做 端口(逻辑端口)。
    系统常用:0到1024, 我们可分配:0到65535


  网络协议:定义的一个网络通信的规则。国际组织定义的通用协议:TCP/IP;UDP/IP(这个是传输层网络层的协议)

二、网络模型:

    OSI 参考模型:  应用层 : 表示层 : 会话层 : 传输层 : 网络层 : 数据链路层 : 物理层

    TCP/IP 参考模型:        应用层       : 传输层 : 网络层 :      主机至网络层



三、IP地址:

  Java中,将对ip地址的操作方法封装成了对象,我们找到相关对象,查看其方法就可以操作网络ip地址了。

  InetAddrss: 一个操作IP地址的类。(在 java.net包中)

      特点: 没有构造方法,但是却有非静态方法,所以一定有一个静态方法能让我们拿到一个该类对象。

    对象方法:
           static InetAddress getLocalHost() 返回本地主机

           static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。

         static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务
                                  返回其 IP 地址所组成的数组。




    获取方法:
          String getCanonicalHostName() 获取此 IP 地址的完全限定域名。

          String getHostAddress() 返回 IP 地址字符串(以文本表现形式),重点掌握。

          String getHostName() 获取此 IP 地址的主机名。

      异常:UnknownHostExceprion


四、端口号

    用于表示进程的逻辑地址,是不同进程的标示。

    有效端口:0 ~ 65535 .其中0~1024为系统端口或保留端口。

    也就是说,端口没有对象。


五、传输协议

  重点掌握。

    UDP协议:
        1、不需要建立连接,即 面向无连接。
        2、将数据及源和目的封装成数据包,每个包的大小不能超过64k。
        3、因为是无连接协议, 所以是不可靠的。
        4、因为不需要连接,所以传输速度很快。
      如:聊天,视频会议,直播。

    TCP协议:
        1、建立连接,形成数据传输的通道。
        2、在连接中进行大数据传输。
        3、通过三次握手完成传输,是可靠协议。
        4、必须会建立连接,效率会稍低。
      如:下载。



    Socket:
        1、其不是协议,是为网络服务提供的一种机制。(翻译为:套接字)
        2、通信的两端都有Socket。
        3、网络通信其实就是Socket之间的通信。
        4、数据在两个Socket之间通过IO传输。
      所以:不同的协议有不同的Socket

  五。一)UDP协议传输:

        1、数据发送的思路:
          1)、建立upsocket服务。
          2)、提供数据,并将数据封装到包中。
          3)、通过socket服务的发送功能将数据发送出去。
          4)、关闭资源。

        2、数据接受的思路:
          1)、定义一个udpsocket服务。 通常会定义一个端口,其实就是给这个网络应用程序定义一个数字标示。
             方便明确哪些数据可以被该程序处理。(构造的时候就可以定义)
          2)、定义一个数据包,该包用于存储接收到的数据。
             该包对象中有更多功能提取处理到字节数据中的不同信息。
          3)、通过socket服务的receive方法将接收到的数据存入到已经定义好的数据包中。(阻塞方法)
          4)、通过数据包特有同功能将这些不同的数据取出,并作出处理。
          5)、关闭资源。

      主要示例演示:
          建立服务: DatagramSocket ds = new DatagramSocket(10000)
               建立一个服务并指定监听端口为10000.

          数据包 : DatagramPacket dp1 = new DatagramPacket(buf,buf.length,InetAddress.getHostAddress("***8"),port);
               建立一个数据发送包,发送的数据在字节数组buf中,并且指定长度,发送到指定ip地址的指定端口。
                DaragramPacket dp2 = new DatagramPacket(buf,buf.length);
               建立一个数据接收包,接收的数据存在指定的字节数组的指定位置中。

          数据发送与接收:
                ds.send(dp1); 发送一个数据包。
                ds.receive(dp2); 接收一个数据包。

          关闭资源: ds.close();

      ip地址是可能发生变化的,还有防火墙等保护软件,都有可能造成数据传递的丢失。
      所以要调用本机IP的时候,要么临时获取,要么使用"LocalHost",要么使用 “127.0.0.1 ”


  五。二)、TCP协议传输:分为客户端和服务端,(Socket and ServerSocket)

      1、客户端:
            注意)、通过查阅API,发现该类一创建就可以建立一个连接通道,连接一个主机。
                因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端的存在,
                并连接成功,形成通路后,在该通道进行传输。

            1)、创建Socket服务器,并指定要连接的主机和端口.
                new Socket(InetAddress i, int port)

            2)、为了发送和就收数据,要获取Socket通道的 输出流 和 输入流。
                getInputStream()    getOutputStream()

            3)、通过流对象类操作(发送或者接收)数据。
                IO方法


            3)、关闭Socket服务器。
                (s.close();   s.shutdownInput();   s.shutdownOutput() )


      2、服务端:

            1)、建立ServerSocket服务器,并指定要监听的端口。
                new ServerSocket(int port);
                new ServerSocket(int port, int backlog );这个方法还规定了同时连接到服务器的客户端个数。

            2)、获取连接过来的客户端对象:
                通过ServerSocket的 accept方法获取这个对象。(没有连接就会等,该方法阻塞)
                Socket s = ss.acceput();

            3)、如果客户端发来数据,那么服务端就要使用对应客户端的对象,通过该对象的输入和输出流来操作数据。
                getInputStream() getOutputStream()

            4)、关闭服务端(可选)、 关闭客户端(可选)
                ss.close(); s.close(); s.shutdownInprt(); s.shutdownOutput()

        注意:UDP使用的是send、receive和数据包传送数据。
           TCP使用的是 accept连接客户端,流对象传输数据。



六、URL 和 URI

    他们都是统一定位标识符。

    将一个服务器地址定位字符串封装成为一个对象, 我们可以通过该对象的方法来获取这个字符串中代表各部分的子串。
    我们在拿到该对象之后,通过解析该对象知道其访问途径上的各种参数。

    构造方法:
          URL(String spec) 根据 String 表示形式创建 URL 对象。

          URL(String protocol, String host, int port, String file) 根据指定 protocol、host、port 号和 file 创建 URL 对象。


    常用方法:
          String getFile() 获取此 URL 的文件名。

          String getHost() 获取此 URL 的主机名(如果适用)。

          String getPath() 获取此 URL 的路径部分。

          int getPort() 获取此 URL 的端口号(如果封装信息中没有端口号这一项,就会返回 -1,所以我们在解析一个
                  URL对象的时候,会对该返回值进行判断,如果为-1, 就默认访问 服务器所在主机的 80 端口,
                  由此可见,我们在使用浏览器访问各个服务器时都是默认在访问该主机的80端口,即 web 80端口)。

          String getProtocol() 获取此 URL 的协议名称。

          String getQuery() 获取此 URL 的查询部分。

      如:以上方法对一个
            URL url = new URL("http://192.168.1.100:8080/myweb/Demo.html?jjj");拿到的是:

            //getFile >>>/myweb/Demo.html?jjj
            //getHost >>>192.168.1.100
            //getPath >>>/myweb/Demo.html
            //getPort >>>8080
            //getQuery >>>jjj
            //getProtocol >>>http



    重要方法:
          URLConnection openConnection()  返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
                             就是说,只要调用URL对象的openConnection方法,其就会其连接该对象
                             内部封装字符串所对应的服务器,并且返回一个 URLConnection方对象。



七:URLConnection

      表示 封装了应用层协议(http)后的远程连接通道的对象, 该对象内部已经封装了 Socket对象(TCP协议)和应用层协议,
    并且已经实现了远程连接。(相当于建立了一个客户端,从传输层到了应用层)

    获取方法:
          使用URL的 openConnection方法获取该连接对象。

    常用方法:

          InputStream      getInputStream() 返回从此打开的连接读取的输入流。

          OutputStream   getOutputStream() 返回写入到此连接的输出流。


八:域名解析

    1、当我们在浏览器上访问时,输入的是: http://192.168.1.254:8080 时,表示本次访问使用的应用层协议是:http,
  访问的主机是ip地址为192.168.1.254的主机, 且访问的是该主机的8080端口。

    2、当我们在浏览器上访问时,输入的是: http://19.168.1.254时,表示本次访问使用的是应用层协议:http
  访问的主机是ip地址为192.168.1.254的主机,且访问的是默认端口80.

    3、当我们在浏览器上访问时,输入的是:http://www.baidu.com的时候,表示本次访问的应用层协议是:http
  之后会在本地的 : c:windowssystemsdriversexthost 的映射文件上查找相关主机名称和ip地址的额映射表。
  (该表中存有一些ip地址和主机名称的映射关系),当本地有这个名称的映射关系时,就使用本地记录的ip地址来
  进行网络访问。(现在的访问方式同2)

    4、当在3中的访问方式中,没有在本地找到映射关系时,浏览器会在网络中的公共服务器 NDS 上进行查找,该服务器上
  记录了大量的域名和主机ip地址的映射关系,我们查找到这个地址,拿回本地进行网络主机访问。

    5、当我们在本地没有找到指定域名的映射关系,在网络DNS 服务器上也没有找到对应的映射关系时,
  就会显示: 找不到该页面(或者 该页面不存在)



九、获取InetAddress的各种方法:

    使用InetAddress 的自身的方法(无构造):

          static InetAddress getLocalHost() 返回本地主机

          static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。

          static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务
                                  返回其 IP 地址所组成的数组。

    使用DatagramPacket 中的方法:

          InetAddress getAddress()

    使用Socket 中的方法:

          InetAddress getInetAddress()


    (之后使用InetAddress的getHostName 和 getHostAddress()等到指定主机的ip, 和名称)


十、网络编程的其他注意事项

      1、在使用自己本机的服务器时,要使用自己的浏览器访问自己的服务器, 使用地址为: 本机IP:服务器端口
    但是要注意的是,不能使用 https//协议, 只能使用http//协议,或者本地不带http访问。
    而IP地址是本机IP(127.0.0.1),或者本机的网络IP(一般是路由器分配的局域网IP),或者是:LocalHost。

    当该服务器是自己写的服务器时,且没有定义网络http协议的情况下,只能使用不带http访问。






原文地址:https://www.cnblogs.com/soficircle/p/6763297.html