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();

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagelearn.JavaBasics.Class;2

3 import java.io.*;4 importjava.net.InetAddress;5 importjava.net.ServerSocket;6 importjava.net.Socket;7 importjava.net.UnknownHostException;8

9 public classSocketDemo {10 public voidserver() {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 intlen;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 voidclient() {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 intlen;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 voidmain(String[] args) {153 new Thread(newRunnable(){154 @Override155 public voidrun() {156 //TODO Auto-generated method stub

157 newSocketDemo().server();158 }159 }).start();160

161 new Thread(newRunnable() {162 @Override163 public voidrun() {164 //TODO Auto-generated method stub

165 newSocketDemo().client();166 }167 }).start();168 }169

170 }

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagelearn.JavaBasics.Class;2

3 importjava.io.IOException;4 importjava.net.DatagramPacket;5 importjava.net.DatagramSocket;6 importjava.net.InetAddress;7 importjava.net.SocketException;8 importjava.net.UnknownHostException;9

10 public classTestUDP {11 public voidreceive(){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 voidsend() {40 DatagramSocket ds = null;41

42 try{43 //新建一个用于发送的Socket

44 ds = newDatagramSocket();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 voidmain(String[] args) {71 new Thread(newRunnable(){72 @Override73 public voidrun() {74 newTestUDP().receive();75 }76 }).start();77

78 new Thread(newRunnable(){79 @Override80 public voidrun() {81 newTestUDP().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(传播延迟): 分组在链路上传播的延迟,好比汽车在公路上的时间。

丢包: 如果路由器的缓存区已经满了,还有很多的分组过来,那再过来的分组就会被路由器忽略,即丢包。(电路交换和报文交换,不会出现丢包)

22ec7d892e9be31d0e379f6c59c0039e.png

9dd9b986f2d002807db07e71b617347b.png

网络体系结构

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

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

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

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

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

0. 物理介质

1. 物理层:规范如何在不同的介质上发送比特流,并最终产生一个统一的接口。

---- 接口特性: 机械特性、电气特性、功能特性和规程特性。

---- 比特编码: 用什么表示比特,怎么表示。

---- 数据率

---- 比特同步

---- 传输模式: 单工, 半双工, 双工。

2. 数据链路层:负责节点-节点的数据传输

---- 组帧

---- 物理寻址

---- 流量控制: 两端的发收速度统一

---- 差错控制

---- 访问控制(接入控制)

3. 网络层:负责源主机到目的主机数据分组的交付

---- 逻辑寻址(唯一的逻辑地址,如:IP地址)

---- 路由

---- 分组转发

4. 传输层:实现端对端的进程间的完整报文的传送

---- 报文的分段与重组

---- SAP寻址 (确保完整的报文提交给正确的进程,如端口号)

e48bd668e134ec30275ee17aeb41ed0e.png

(x, y 就是端口号)

---- 连接控制

---- 流量控制

---- 差错控制 (链路层的差错控制可能有中间系统,而这个是针对源主机和目的主机的)

5. 应用层:

每层之间都要加“头”, 加控制信息是因为什么:(以下是可选的)

1. 要加地址信息

2. 要进行差错检测编码,保证数据正确

3. 加协议控制

e68b1359b65c46a5292689cb202e39db.png

fc6d913c315ae62170b367fd3b67b1c9.png

966ad3f0aeb076fe60830fbbfd11cc97.png

c10505c9560edb1d10e0dcc75928c5be.png

81399957ad5559c993aec8ae75365b08.png

a7340c233b8fa35604d654a864b266df.png

dc0b5a8cb7039eb229dce57b8b55d95e.png

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

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

网关:

协议

68f7ae010586ea4280356d2832fc9c3b.png

UDP:   -- 复用/分用--简单的错误校验--udp段(segment)可能丢失,并且是非按序到达--无连接的, 发送方和接收方之间不需要握手, 每个udp段的处理独立于其他段

有了TCP, UDP为什么存在

-- 无须建立连接,减少延迟

-- 实现简单,无须维护连接状态

-- 头部开销小

-- 没有拥塞控制,应用可更好地控制发送时间和速率

用途

-- 流媒体(容忍丢失,速率敏感)

-- DNS, SNMP

也可完成可靠的数据传输

-- 在应用层真假可靠性机制

-- 应用特定的错误恢复机制

TCP

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值