通过一段时间对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:\windows\systems\drivers\ext\host 的映射文件上查找相关主机名称和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访问。

javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)的更多相关文章

  1. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

  2. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  3. python-socket网络编程笔记(UDP+TCP)

    端口 在linux系统中,有65536(2的16次方)个端口,分为: 知名端口(Well Known Ports):0-1023,如80端口分配给HTTP服务,21端口分配给FTP服务. 动态端口(D ...

  4. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

  5. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  6. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  7. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  8. java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)

    java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...

  9. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

随机推荐

  1. vscode git设置

    vscode只能打开一下界面: 在setting.path增加git.path选项,再使用linux的方法配置路径,就是使用D:/../bin/git.exe而不是\\ 重启vscode,git设置即 ...

  2. Clear Linux 为脚本语言提供更高的性能

    导读 Clear Linux的领先性能不仅限于C/C++应用程序,而且PHP,R和Python等脚本语言也有很大的提升速度.在一篇新的博客文章中,英特尔的一位开发人员概述了他们对Python的一些性能 ...

  3. java中值类型与引用类型的关系

    值类型:就是java的基本类型.byte.short.int.long.float.char.double.boolean 引用类型:类(class).接口(Interface).数组(Array) ...

  4. Dijkstra—校园景点游览问题

    #include<iostream> #include<cstdio> #include<cstring> #define MAX 9999999 using na ...

  5. 安卓Android基础四天

    网页源码查看器 HttpURLConnection:用于发送和接受数据 ScrollView只能由一个孩子 消息机制的写法(***) anr Application not response 应用无响 ...

  6. 第一天:学会如何在pycharm上编写第一条robotframework用例

    ---恢复内容开始--- 1.python环境的安装和依赖包的下载

  7. DevOps 10秒钟进阶大师之路

    简介:DevOps(Development开发和Operations运维的组合词),是一种文化.原则.思维.理念.组织. DevOps 是一个完整的面向开发.运维的工作流,以 IT 自动化以及持续集成 ...

  8. pytorch CNN 手写数字识别

    一个被放弃的入门级的例子终于被我实现了,虽然还不太完美,但还是想记录下 1.预处理 相比较从库里下载数据集(关键是经常失败,格式也看不懂),更喜欢直接拿图片,从网上找了半天,最后从CSDN上下载了一个 ...

  9. ACM中的fread读入

    fread可以加快读入速度,尤其是读特大的二进制文件. #include <cctype> typedef long long LL; char buf[100000],*p1=buf,* ...

  10. Treap树 笔记

    预备知识:二叉查找树.堆(heap).平衡二叉树(AVL)的基本操作(左旋右旋) 定义: Treap.平衡二叉树.Tree+Heap.树堆. 每个结点两个键值(key.priority). 性质1. ...