编程语言
首页 > 编程语言> > 第十六章、网络编程

第十六章、网络编程

作者:互联网

网络编程

1. 网编先导知识

  1. 网络应用开发架构

    • C / S即client(客户端) / server(服务端)

      ​ 飞秋、Git、百度云、输入法....

    • B / S即browser(浏览器)/ server(服务器)

      ​ 淘宝、邮箱、百度、知乎....

    • B / S是特殊的C / S架构

  2. 网卡:每个实际存在在计算机硬件里面的

  3. mac地址:每块网卡上都有一个全球唯一的mac地址

  4. 交换机:是连接多台机器并帮助通讯的物理设备,只可以识别mac地址

  5. 协议:两台物理设备之间对于要发送的内容,长度和顺序做的一些规范

  6. ip地址(规格)

    • ipv4协议:韦德点分十进制,32位的二进制

      ​ 范围:0.0.0.0~255.255.255.255

    • ipv6协议:8位的冒分十六制,128位十进制来表示 (点分十进制不足以表示)

      ​ 范围:0:0:0:0:0:0:0:0 ~ FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

  7. ip地址的使用:

    • 如果一个ip地址向北所有人都看到,这个ip地址是必须要申请的,即公网ip

    • 提供内网ip,供局域网使用:

      192.168.0.0 - 192.168.255.255

      172.16.0.0 - 172.31.255.255

      10.0.0.0 - 10.255.255.255

  8. 交换机实现的ARP协议(地址解析协议)

    • 通过ip地址获取一台机器的mac地址

    • 交换机工作原理:收到一个请求,通知所有连接他的ip地址,获取对应的ip地址的mac地址并返回给请求的ip地址

  9. 网关ip:一个局域网的网络出口,访问局域网以外的区域都需要经过路由器的网关

  10. 网段:一般是一个末尾为0的地址段

  11. 子网掩码:判断两个机器是否在同一个网段

    屏蔽一个IP地址的网络部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0

    # 示例:通过将请求的计算的子网掩码和两个要匹配的计算机的二进制按位与运算
    ip = 255.255.255.255
    	11111111.11111111.11111111.11111111
    ip = 192.168.12.87
        11000000.10101000.00001100.00000111
    ip = 192.168.12.7
    
  12. ip地址可以确认一台机器,port端口可以确认一台机器的一个应用,端口的范围:0~65535

  13. 一般实现互联,使用127.0.0.1,是自己的地址,不过减缓及ip地址是可以过交换机的。

2. ISO模型(五层结构)

  1. 物理层

    • 物理层是ISO模型的最底层,负责网络设备在各种物理介质上传输比特流,并规定各种各种物理传输介质、接口的机械特性和电气特性。一般用位表示。
  2. 数据链路层

    • mac地址,ARP协议 物理设备:网卡,交换机。
  3. 网络层

    • IPV4/IPV6协议,物理设备:路由器,三层交换机(交换机具有路由功能)ip通过DNS解析获取(DNS域名和ip互相映射的数据库)
  4. 传输层

    • tcp协议和udp协议,物理设备:端口,四层路由器,四层交换机。
  5. 应用层

    • 应用层 :https/http/ftp/smtp协议 所有的应用层协议是基于tcp或者是udp协议
  6. 数据封装和解封

    数据封装

    图12-3 数据封装.png

    数据解封

图12-4 数据解封.png

3. 传输层的两种协议(tcp/udp)

3.1 tcp协议

  1. 特点

    • 面向连接的,可靠,但是慢,可以实现全双工通信,即双方都是实时的,区别于半双工(传呼机)
    • 无边界,流式传输(导致粘包问题)
    • 长连接:会一直占用双方的端口
    • 能够传输的数据长度几乎没有限制
  2. 三次握手和四次挥手

    • 具体的三次握手(连接方式):

      # accept接受过程中等待客户端的连接
      # connect客户端发起了一个syn连接请求(附带了一个随机数)
      # 如果得到了server端的响应ack的同时还会再收到一个由server端发来的syn链接请求
      # client端进行回复ack之后,就建立起了一个tcp协议的链接
      # 备注:三次握手的过程再代码中是由accept和connect共同完成的,具体的细节再socket中没有体现出来
      
    • 具体的四次挥手(断开连接方式):

      # server和client端对应的在代码中都有close方法
      # 每一端发起的close操作都是一次fin的断开请求,得到'断开确认ack'之后,就可以结束一端的数据发送
      # 如果两端都发起close,那么就是两次请求和两次回复,一共是四次操作
      # 可以结束两端的数据发送,表示链接断开了
      
  3. 应用场景

    • QQ和微信等上面的传输压缩文件,缓存下载的电影等等

3.2 udp协议

  1. 特点
    • 面向数据报的,无连接,速度很快,类似于发短信,能实现一对一,多对一,一对多的高效通讯
    • 由于没有回执,对于发送信息和接受信息的双方来说,可能存在丢失消息的情况
    • 能够传递的长度有限,是根据数据传递设备的位置有关系
  2. 应用场景
    • 通信类的 如QQ 微信,发短信, 在线观看小视频等

3.3 Socket

  1. 概念:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

  2. 原理:进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的

    图12-5 Socket的作用.png

  3. Socket之间的连接过程

    • 服务器监听
    • 客户端请求
    • 连接确认
  4. java实现Socket步骤

    • 创建Socket

    • 打开连接到Socket的输入/出流

    • 按照一定的协议对Socket进行读/写操作

    • 关闭Socket

  5. 代码实现

    // 服务端 
    package demo2;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
    	public static void main(String[] args) {
    		try {
    			// 1.创建服务器socket服务。通过ServerSocket对象,指定端口号
    			ServerSocket ss = new ServerSocket(8888);
    			System.out.println("服务端等待连接....");
    
    			// 2.获取连接过来的客户端对象,使用accept()
    			Socket s = ss.accept(); // 进行阻塞态
    			System.out.println("客户端连接成功....");
    
    			// 3.通过客户端对象获取socket流读取客户端发来的数据
    			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			String str = br.readLine();
    			System.out.println("客户端发过来的消息是:" + str);
    
    			// 4.通过客户端对象获取socket流向客户端发送数据
    			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    			bw.write("你好,客户端!");
                
    			// 关闭相关资源
    			bw.close();
    			br.close();
    			s.close();
    			ss.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    
    // 客户端
    package demo2;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class Client {
    	public static void main(String[] args) {
    		try {
    			// Socket(String host,int port);
    			// 1.创建Socket对象,指定服务器的ip地址和端口号
    			Socket s = new Socket("127.0.0.1", 8888);
    
    			// 2.通过客户端对象获取socket流读取服务端发来的数据
    			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    			bw.write("你好,服务端!");
    			bw.flush();
    			s.shutdownOutput();
    
    			// 3.通过客户端对象获取socket流读取客户端发来的数据
    			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			String str = br.readLine();
    			System.out.println("服务端发送过来的信息是:" + str);
    
    			// 4.关闭相关资源
    			br.close();
    			bw.close();
    			s.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

4.基于TCP实现Socket编程模型

5. 基于UDP实现Socket编程模型

标签:第十六章,java,Socket,编程,网络,new,close,import,客户端
来源: https://www.cnblogs.com/borntodie/p/14148960.html