在操做系统中,网络和文件其实都是经过I/O总线链接到系统。都会有一个定位类,例如:file和Url,而后再经过input,output等I/O类才进行数据交互。本文介绍下java的网络,及其相关类。java
不一样设备之间、不一样进程之间的通讯都是须要通讯协议来格式化数据、分装,而后组装数据、反格式化数据。算法
a) 7层协议:数据库
整体划分:编程
ISO提出的OSI(Open System Interconnection)模型将网络分为七层,即 物理层( Physical )、 数据链路层(Data Link)、网络层(Network)、 传输层(Transport)、 会话层(Session)、 表示层(Presentation)和 应用层(Application)。浏览器
1. 物理层服务器
物理层(Physical layer)是参考模型的最低层。该层是网络通讯的数据传输介质,由链接不一样结点的电缆与设备共同构成。主要功能是:利用传输介质为数据链路层提供物理链接,负责处理数据传输并监控数据出错率,以便数据流的透明传输。网络
2. 数据链路层socket
数据链路层(Data link layer)是参考模型的第2层。 主要功能是:在物理层提供的服务基础上,在通讯的实体间创建数据链路链接,传输以“帧”为单位的数据包,并采用差错控制与 流量控制方法,使有差错的物理线路变成无差错的数据链路。tcp
3. 网络层加密
网络层(Network layer)是参考模型的第3层。主要功能是:为数据在结点之间传输建立逻辑链路,经过路由选择算法为分组经过通讯子网选择最适当的路径,以及实现拥塞控制、 网络互联等功能。
4. 传输层
传输层(Transport layer)是参考模型的第4层。主要功能是向用户提供可靠的端到端(End-to-End)服务,处理数据包错误、数据包次序,以及其余一些关键传输问题。传输层向高层屏蔽了下层数据通讯的细节,所以,它是计算机通讯体系结构中关键的一层。
5. 会话层
会话层(Session layer)是参考模型的第5层。主要功能是:负责维扩两个结点之间的传输连接,以便确保点到点传输不中断,以及管理数据交换等功能。
6. 表示层
表示层(Presentation layer)是参考模型的第6层。主要功能是:用于处理在两个通讯系统中交换信息的表示方式,主要包括数据格式变换、 数据加密与解密、数据压缩与恢复等功能。
7. 应用层
应用层(Application layer)是参考模型的最高层。主要功能是:为 应用软件提供了不少服务,例如文件服务器、数据库服务、 电子邮件与其余网络软件服务。
b) 5层协议
名称 | 功能 | 协议 |
应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP(文件传输)、HTTP(万维网)、SNMP、FTP、SMTP、DNS、Telnet(远程终端接入) |
传输层 | 提供端对端的接口 | TCP、UDP |
网络层 | 为数据包选择路由 | IP、ICMP、OSPF、EIGRP、Lgmp |
数据链路层 | 传送有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、MTU |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO21十、IEEE80二、IEEE802.2 |
c) TCP数据封装
tcp封装数据包的格式为:
数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)
IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)
TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)
d) tcp链接《3次握手为主》
tcp的3次握手
tcp的4次握手
java.net.InetAddress:ip处理类,将域名或者IP解析为 ip/域名的形式。
java.net.URL:网络链接类。封装了InetAddress和系统网络链接。处理链接问题,和File类对文件的做用类似。
java.net.URLConnection:网络处理类,链接后处理数据交互等功能。
java.net.ServerSocket:服务器
java.net.Socket:
/** * @throws Exception * @see 域名处理:返回域名/IP */ @Test public void intAddress() throws Exception { InetAddress local = InetAddress.getLocalHost(); System.out.println("本地IP:" + local.getHostAddress());//本地IP:192.168.124.1 System.out.println("本地名称:" + local.getHostName());//本地名称:ssHss-PC InetAddress[] local2 = InetAddress.getAllByName("www.baidu.com");//IP180.97.33.108 for (InetAddress ia : local2) { System.out.println("IP" + ia.getHostAddress()); System.out.println("名称" + ia.getHostName()); //IP:180.97.33.108 //名称:www.baidu.com //IP:180.97.33.107 //名称:www.baidu.com } }
/** * @throws Exception * @see URLConnection * @see 域名类:URL、处理链接前的工做(协议、域名、IP、端口、链接) * @See 链接处理类类:URLConnection、处理链接后的工做(读写) */ public void testURL() throws Exception { // 域名 String urlPath = "http://www.baidu.com"; // 生成 URL类 URL url = new URL(urlPath); // 链接 URLConnection urlconn = url.openConnection(); System.out.println("========== head ==========="); Map<String, List<String>> map = urlconn.getHeaderFields(); for (Entry<String, List<String>> entry : map.entrySet()) { String key = entry.getKey(); List<String> value = entry.getValue(); System.out.println(key + " : " + value); } System.out.println("========== inputStream ================"); InputStream urlinput = urlconn.getInputStream(); /** * 以字符 */ BufferedReader r = new BufferedReader(new InputStreamReader(urlinput)); String readLine = null; int line = 1; while ((readLine = r.readLine()) != null) { System.out.println(line + " :" + readLine); line++; } /** * 以字节 */ // byte[] tempBytes = new byte[100]; // int byteRead = 0; // while ((byteRead = urlinput.read(tempBytes)) != -1) { // System.out.println(tempBytes); // } }
链接www.baidu.com获取的信息:
浏览器截图
console打印图:
a) 监听80端口:
/** * @throws IOException * @see severSocket :服务器Socket * @see socket:网络处理对象 */ @Test public void serviceSocket() throws IOException { // 建立ServerSocket(端口) ServerSocket server = new ServerSocket(8080); // 监听--》阻塞(等待链接) Socket socket = server.accept(); // 处理数据 BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream())); String readline = null; while ((readline = buffer.readLine()) != null) { System.out.println(readline); } }
Console图
browers图
b) Server-Clinet实例
server-socket: /** * @throws IOException * @see severSocket :服务器Socket * @see socket:网络处理对象 */ @Test public void serviceSocket() throws IOException { // 建立ServerSocket(端口) ServerSocket server = new ServerSocket(8080); // 监听--》阻塞(等待链接) Socket socket = server.accept(); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); System.out.println("========== server-write ==========="); out.println("你好!--我是server"); // 处理数据 BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream())); String readline = null; System.out.println("========== server-read ==========="); while ((readline = buffer.readLine()) != null) { System.out.println(readline); } out.close(); socket.close(); } client: /** * @throws IOException * @See clientSocket */ @Test public void clientSocket() throws Exception { Socket s = new Socket("localhost", 8080); PrintWriter out = new PrintWriter(s.getOutputStream(), true); System.out.println("========== client-write ==========="); out.println("你好!..我是client"); BufferedReader buffer = new BufferedReader(new InputStreamReader(s.getInputStream())); String readline = null; System.out.println("========== client-read ==========="); while ((readline = buffer.readLine()) != null) { System.out.println(readline); } out.close(); s.close(); }