zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JS实现继承的几种方式
    网站与域名知识扫盲-符号标签大全
    网站与域名知识扫盲
    第八届蓝桥杯决赛 发现环
    1014. Waiting in Line (模拟)
    第八届蓝桥杯决赛 对局匹配
    nvm安装nodejs(安装在非系统盘内)
    jquery datatable 获取当前分页的数据
    高德地图--轨迹回放(一)
    html5shiv.js和respond.js引入不起作用解决
  • 原文地址:https://www.cnblogs.com/hangtt/p/4855290.html
Copyright © 2011-2022 走看看