• java高薪之路__009_网络


    1. InetAddress类
    2. Socket: IP地址和端口号的结合,socket允许程序把网络连接当成一个流,数据在两个socket间通过IO传输, 通信的两端都要有socket. 主动发起通信请求的是客户端,等待通信请求的是服务端
    3. DatagramSocket 和 DatagramPacket实现了UDP协议网络程序, 使用DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达
      DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号,给出了完整的地址信息,因此无须建立发送方和接收方的连接
    4. URL类
      URL u = new URL("http://www.baidu.com");
      InputStream in = u.openStream();

      URLConnection uc = u.openConnection();
      uc.getInputStream();
      uc.getOutputSteam();
      1 package learn.JavaBasics.Class;
      2 
      3 import java.io.*;
      4 import java.net.InetAddress;
      5 import java.net.ServerSocket;
      6 import java.net.Socket;
      7 import java.net.UnknownHostException;
      8 
      9 public class SocketDemo {
     10     public void server() {
     11         ServerSocket ss = null;
     12         Socket s = null;
     13         InputStream in = null;
     14         OutputStream out = null;
     15 
     16         try {
     17             //开始在端口监听
     18             ss = new ServerSocket(9999);
     19             
     20             //当有连接进来时,会新建一个socket
     21             s = ss.accept();
     22             
     23             //获取输入流
     24             in = s.getInputStream();
     25             
     26             //对输入流进行处理
     27             byte[] b = new byte[1024];
     28             int len;
     29             String msg = "";
     30             
     31             while((len=in.read(b)) != -1) {
     32                 msg = new String(b, 0, len);
     33             }
     34             
     35             System.out.println("The message from "+ s.getInetAddress().getHostName()+
     36                     "(ip:"+ s.getInetAddress().getHostAddress()+") is: ""+msg+""");
     37             
     38             
     39             //获取输出流,反馈信息
     40             out = s.getOutputStream();
     41             out.write("The msg from client has been received".getBytes());
     42         } catch (IOException e) {
     43             // TODO Auto-generated catch block
     44             e.printStackTrace();
     45         } finally {
     46             if (in != null) {
     47                 try {
     48                     in.close();
     49                 } catch (IOException e) {
     50                     // TODO Auto-generated catch block
     51                     e.printStackTrace();
     52                 }
     53             }
     54             
     55             if (s != null) {
     56                 try {
     57                     s.close();
     58                 } catch (IOException e) {
     59                     // TODO Auto-generated catch block
     60                     e.printStackTrace();
     61                 }
     62             }
     63             
     64             if (ss != null) {
     65                 try {
     66                     ss.close();
     67                 } catch (IOException e) {
     68                     // TODO Auto-generated catch block
     69                     e.printStackTrace();
     70                 }
     71             }
     72             
     73             if (out != null) {
     74                 try {
     75                     out.close();
     76                 } catch (IOException e) {
     77                     // TODO Auto-generated catch block
     78                     e.printStackTrace();
     79                 }
     80             }
     81         }
     82     }
     83     
     84     public void client() {
     85         Socket s = null;
     86         OutputStream out = null;
     87         InputStream in = null;
     88         
     89         try {
     90             //新建一个Socket
     91             s = new Socket(InetAddress.getLocalHost(), 9999);
     92             
     93             //获取输出流
     94             out = s.getOutputStream();
     95             
     96             //发送信息, 并提示
     97             out.write("This is client".getBytes());
     98             System.out.println("client message has sent");
     99             
    100             //这句话存在的原因是,Server端的getInputSream流的read方法是阻塞, 它在接收信息,但不知道信息是否接收完全,所以一直在等待,
    101             //所以Server端的反馈信息无发发送过来,程序死掉,
    102             //这里显式的通知Server,发送结束
    103             //FileInputSteam里的read方法与这个一样,但BufferInputSteam里的read方法是非阻塞的
    104             s.shutdownOutput();
    105             
    106             //获取输入流,接收服务端的反馈信息
    107             in = s.getInputStream();
    108             
    109             byte[] b = new byte[1024];
    110             int len;
    111             String msg = "";
    112             
    113             while((len=in.read(b)) != -1) {
    114                 msg = new String(b, 0, len);
    115             }
    116             System.out.println("Response from Server: "+msg);
    117             System.out.println("connection over");
    118             
    119             //这里的后边没有了,所以服务端可以不显式的提示,不影响功能
    120         } catch (IOException e) {
    121             // TODO Auto-generated catch block
    122             e.printStackTrace();
    123         } finally {
    124             if (out != null) {
    125                 try {
    126                     out.close();
    127                 } catch (IOException e) {
    128                     // TODO Auto-generated catch block
    129                     e.printStackTrace();
    130                 }
    131             }
    132             if (s != null) {
    133                 try {
    134                     s.close();
    135                 } catch (IOException e) {
    136                     // TODO Auto-generated catch block
    137                     e.printStackTrace();
    138                 }
    139             }
    140             
    141             if (in != null) {
    142                 try {
    143                     in.close();
    144                 } catch (IOException e) {
    145                     // TODO Auto-generated catch block
    146                     e.printStackTrace();
    147                 }
    148             }
    149         }
    150     }
    151     
    152     public static void main(String[] args) {
    153         new Thread(new Runnable(){
    154             @Override
    155             public void run() {
    156                 // TODO Auto-generated method stub
    157                 new SocketDemo().server();
    158             }            
    159         }).start();
    160         
    161         new Thread(new Runnable() {
    162             @Override
    163             public void run() {
    164                 // TODO Auto-generated method stub
    165                 new SocketDemo().client();
    166             }            
    167         }).start();
    168     }
    169 
    170 }
    View Code
     1 package learn.JavaBasics.Class;
     2 
     3 import java.io.IOException;
     4 import java.net.DatagramPacket;
     5 import java.net.DatagramSocket;
     6 import java.net.InetAddress;
     7 import java.net.SocketException;
     8 import java.net.UnknownHostException;
     9 
    10 public class TestUDP {
    11     public void receive(){
    12         DatagramSocket ds = null;
    13         
    14         try {
    15             //定义接收的数据报大小
    16             byte[] b = new byte[1024];
    17             DatagramPacket packet = new DatagramPacket(b, 0, b.length);
    18             
    19             //定义一个接收的Socket,用于在特定的端口接收指定大小的数据报
    20             ds = new DatagramSocket(9999);
    21             ds.receive(packet);
    22             
    23             String str = new String(packet.getData(), 0, packet.getLength());
    24             
    25             System.out.println(str);
    26         } catch (SocketException e) {
    27             // TODO Auto-generated catch block
    28             e.printStackTrace();
    29         } catch (IOException e) {
    30             // TODO Auto-generated catch block
    31             e.printStackTrace();
    32         } finally {
    33             if (ds != null) {
    34                 ds.close();
    35             }
    36         }
    37     }
    38     
    39     public void send() {
    40         DatagramSocket ds = null;
    41         
    42         try {
    43             //新建一个用于发送的Socket
    44             ds = new DatagramSocket();
    45             
    46             //数据
    47             byte[] b = "你好, 这里是发送端的数据, UDP sender".getBytes();
    48             
    49             //封装数据到数据报中, 一个数据报不能大于64K, 记录着数据信息, 两端的IP和端口号
    50             DatagramPacket packet = new DatagramPacket(b, 0, b.length, InetAddress.getLocalHost(), 9999);
    51             
    52             //使用Socket把数据报发走
    53             ds.send(packet);
    54         } catch (SocketException e) {
    55             // TODO Auto-generated catch block
    56             e.printStackTrace();
    57         } catch (UnknownHostException e) {
    58             // TODO Auto-generated catch block
    59             e.printStackTrace();
    60         } catch (IOException e) {
    61             // TODO Auto-generated catch block
    62             e.printStackTrace();
    63         } finally {
    64             if (ds != null) {
    65                 ds.close();
    66             }
    67         }
    68     }
    69     
    70     public static void main(String[] args) {
    71         new Thread(new Runnable(){
    72             @Override
    73             public void run() {
    74                 new TestUDP().receive();
    75             }
    76         }).start();
    77 
    78         new Thread(new Runnable(){
    79             @Override
    80             public void run() {
    81                 new TestUDP().send();
    82             }
    83         }).start();
    84     }
    85 }
    View Code
    要使两台设备之间能进行通信,最简单的方式就是两台机器使用线路互联。
    但如果设备很多的时候会有n(n-1)/2条线路,十分不方便搭建和维护。
    
    所以此时人们想出了一个叫网络的概念, 在这个网络中实现路由的处理和数据的交换, 这样一台设备只需要一条线路连接到网络即可。
    而根据数据交换的方式不同,数据的交换可以分为:电路交换,报文交换和分组交换3种。
    电路交换:线路连接 -- 通信 -- 线路断开    (电话网络)
        线路独享,连接断开时才释放线路。 而此时可能存在多个交换线路共同使用同一条线路的情况, 此时人们使用了一种叫做复用的技术。
     
          频分多路复用(FDM): 不同的频率可以在相同的链路上同时传播(真神奇,怎么同时传的,同一种物质怎么带有两种震动,还是其他方式),典型的是电视网络
          时分多路复用(TDM): 分为不同的时间段
          波分多路复用 (WDM) : 就是光的频分复用
          码分多路复用(CDM): 广泛用于无线链路, 每个用户分配一个唯一的m bit码片序列 .... 较复杂,没研究
    报文交换:---- 存储/转发
        将全部的数据封装成一个报文,然后一个节点,一个节点的发送到目的主机
    分组交换:---- 存储/转发
        将全部的数据拆分成一系列相对较小的数据包,要给小的数据包加上一个”头“,组成一个分组。 需要在源主机和目的主机上进行报文的拆分和重组。
        总的发送时间: t= dproc + dqueue + dtrans + dprop
            dproc(节点处理延迟): 一个分组到达时,路由检查这个分组所携带的信息,并做相应的处理。
            dqueue(排队延迟): 分组排队的时间。
            dtrans(传输延迟): 节点处理一个分组发送的时间,好比收费站放行一台车需要的时间:t= M/R + nL/R。
              M: 总报文大小; R: 每个节点间相同的传输速率; n: 中间的路由数(跳步数-1);   L: 分组大小; 
            dprop(传播延迟): 分组在链路上传播的延迟,好比汽车在公路上的时间。
        丢包: 如果路由器的缓存区已经满了,还有很多的分组过来,那再过来的分组就会被路由器忽略,即丢包。(电路交换和报文交换,不会出现丢包)   

    网络体系结构
    网络里包含的东西这么多,这么复杂, 怎么较好的区分网络里面的细节呢? 人们想到了一种叫分层结构的东东

    这里的分层是从功能上区分的,而不是从硬件上区分的。 同时分层只关注功能,而不关注它的实现,不关心是用硬件实现的,还是用软件实现的。

    分层是抽象的,每一层包含这一层的硬件和协议。 分层是模块化的,只要对上下层的接口不变,内部实现不管。

    实体:任何可发送或接收信息的硬件或软件进程。


    在通信中,主机要完成全部的层, 而中间系统只需要完成3层,有的是两层 ---- 网络层,数据链路层和物理层

    0. 物理介质
    1. 物理层:规范如何在不同的介质上发送比特流,并最终产生一个统一的接口。
          ---- 接口特性: 机械特性、电气特性、功能特性和规程特性。
          ---- 比特编码: 用什么表示比特,怎么表示。
          ---- 数据率
          ---- 比特同步
          ---- 传输模式: 单工, 半双工, 双工。
    2. 数据链路层:负责节点-节点的数据传输
          ---- 组帧
          ---- 物理寻址
          ---- 流量控制: 两端的发收速度统一
          ---- 差错控制
          ---- 访问控制(接入控制)
    3. 网络层:负责源主机到目的主机数据分组的交付
          ---- 逻辑寻址(唯一的逻辑地址,如:IP地址)
          ---- 路由
          ---- 分组转发
    4. 传输层:实现端对端的进程间的完整报文的传送
          ---- 报文的分段与重组
          ---- SAP寻址 (确保完整的报文提交给正确的进程,如端口号)

              (x, y 就是端口号)
          ---- 连接控制
          ---- 流量控制
          ---- 差错控制 (链路层的差错控制可能有中间系统,而这个是针对源主机和目的主机的)
    5. 应用层:


    每层之间都要加“头”, 加控制信息是因为什么:(以下是可选的)
    1. 要加地址信息
    2. 要进行差错检测编码,保证数据正确
    3. 加协议控制

     

     

     

     

     

    网络就是硬件和数据协议的总合

    硬件 ---- 完成路由的确定和数据的交换
    网关:

    协议

    UDP:     -- 复用/分用
              -- 简单的错误校验
              -- udp段(segment)可能丢失,并且是非按序到达
              -- 无连接的, 发送方和接收方之间不需要握手, 每个udp段的处理独立于其他段
        
      有了TCP, UDP为什么存在
          -- 无须建立连接,减少延迟
          -- 实现简单,无须维护连接状态
          -- 头部开销小
          -- 没有拥塞控制,应用可更好地控制发送时间和速率
      用途
          -- 流媒体(容忍丢失,速率敏感)
          -- DNS, SNMP
      也可完成可靠的数据传输
          -- 在应用层真假可靠性机制
          -- 应用特定的错误恢复机制
    TCP
  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/hangtt/p/4855290.html
Copyright © 2020-2023  润新知