通过一段时间对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. java.util.concurrent.TimeoutException: Idle timeout expired: 300000/300000 ms

    Request idle timed out at 123000 ms. That means there was no activity (read or write) for 123000 ms ...

  2. 常见IT工具软件总结

    1. 阿里云在线迁移服务 2.智能媒体管理 格式转换 业务域名管理 1. 每个业务有一个英文单词, 1. 每个 git 的命名应该是 chgg-业务英文-种类 2. 例如 chgg-plant-api ...

  3. Gitlab中README.MD编写格式模板

    README.MD文件 格式: 源码: # Hbase组件 ## Maven依赖 ``` <dependency> <groupId>catf</groupId> ...

  4. Mybatis-java.lang.RuntimeException: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in sqlmap/User.xml ### Cause: org.apache.ibatis.builder.B

    mappers(映射器) 使用相对于类路径的资源 如:<mapper resource="sqlmap/User.xml" /> 使用完全限定路径 如:<mapp ...

  5. Springboot学习问题记录

    1.spring boot与cloud构建微服务,返回数据从json变成了xml 问题:本身spingboot项目是用@RestController注解,返回结果也是json格式,但是结合spring ...

  6. 实验吧 WEB 猫抓老鼠

    人生的第一道CTF题目哇,鸡冻 其实只是学了一下HTTP抓包得到的都是什么,就开始上手胡搞了 题目名字叫猫抓老鼠,还疯狂暗示catch!catch!catch!catch!,就想到要用抓包其实我是因为 ...

  7. 在没有 Emacs 的情况下使用 Org 模式

    导读 每到年初似乎总有这么一个疯狂的冲动来寻找提高生产率的方法.新年决心,正确地开始一年的冲动,以及“向前看”的态度都是这种冲动的表现.软件推荐通常都会选择闭源和专利软件.但这不是必须的. 这是我 2 ...

  8. BZOJ2428[HAOI2006]均分数据——模拟退火

    题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...

  9. Gym100496H-House of Representatives-树

    树上每个元素有一个p,元素之间有距离d,计算一个元素u,使得sigma(d(i,u)*pi)最小. 两次dfs,第一次计算本节点以下的sigma(),第二次利用sump求解出ans. #include ...

  10. alter table,复制, 单表查询

    修改表 语法:1. 修改表名      ALTER TABLE 表名                           RENAME 新表名; 2. 增加字段      ALTER TABLE 表名 ...