【Java知识点整理】网络编程01 认识网络协议、TCP协议、并制作一个简单的互通Demo

网络编程1

  • 网络相关设备? 路由器、交换机、光猫等 / 网线、wifi信号 / 网卡、无线网卡
  • 几个设备组成 局域网。。。多个局域网可以组成 广域网 。。。 城域网。。。因特网
  • 靠基站间连接,海底光缆(有线) / 发射塔(无线)

一、网络

1、网络的概念

网络是由两台以上的计算机(终端)通过物理网络介质(网线、网卡、电话线、交换机、路由器、猫、ADSL等)连接在一起,计算机(终端)与计算机(终端)之间可以进行相互通信(包括文件传递、信息传输等)的通信系统

2、网络的主要作用

​ 1、实现用户间的通信
​ 2、共享数据、信息和资源

  • 身份识别 : IP地址 or 网卡地址(MAC地址)

  • 如何查询IP地址?

    • 使用CMD进行查询,输入

      ipconfig 
      # 或者
      ipconfig /all
      
  • IP地址:

    • IPV4 4个字节 比较常用,如192.168.1.84
    • IPV6 6个字节
  • 如何检测网络是否联通

    主要是检测,电脑和路由器是否联通

    • 路由器有默认网关

    • 需要用到ping+IP地址命令,可以用于检测是否可以联通目标网络地址

      C:\Users\Administrator>ping 192.168.1.1
      
      正在 Ping 192.168.1.1 具有 32 字节的数据:
      来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
      来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
      来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
      来自 192.168.1.1 的回复: 字节=32 时间<1ms TTL=64
      
      192.168.1.1 的 Ping 统计信息:
          数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):
          最短 = 0ms,最长 = 0ms,平均 = 0ms
      
  • 公网IP地址(全世界通用的):提供给所有因特网的用户连接,

    • 比如:当我们在使用腾讯会议时,数据是传输给腾讯服务器,再传给会议成员
    • 使用ping命令也可以直接连接公网ip
  • 如何传输数据

    • 网络联通 :路通了
    • 传输的数据:需要能够识别
      • 双方之间的数据需要共同遵守的协议
      • 这个协议就被成为:通讯协议

二、网络协议

1、什么是网络协议?

网络协议的概念:同一网络或不同网络中计算机的通信所需要的特定一套规则,叫协议。

  • 常用的网络协议:

    • TCP / IP(传输控制协议/因特网互联协议)
    • HTTP(超文本传输协议-实现Internet的交互)
    • FTP(文件传输协议-实现计算机之间的文件传输)
    • SMTP(简单邮件传输协议-提供电子邮件功能)
    • NNTP(网络新闻传输协议-用作共享新闻的电子公告版)。
    • tcp、udp等非常多种
  • 通用的网络协议:7层

    英特网:5层网络协议——TCP/IP协议族

    • 现在初学的是基于TCP协议
⭐️补充知识点:OSI参考模型(7层)

参考出处

为了促进计算机网络的发展,国际标准化组织ISO于1977年成立了一个委员会,在现有网络的基础上,提出了不基于具体机型、操作系统或公司的网络体系结构,称为开放系统互连参考模型,即OSI/RM (Open System Interconnection Reference Model)

OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

各个层级作用,作为拓展理解即可
  • 物理层

    物理层处于OSI的最底层,是整个开放系统的基础。物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传送数据的通路以及传输数据。

  • 数据链路层

    数据链路层的主要任务是实现计算机网络中相邻节点之间的可靠传输,把原始的、有差错的物理传输线路加上数据链路协议以后,构成逻辑上可靠的数据链路。需要完成的功能有链路管理、成帧、差错控制以及流量控制等。其中成帧是对物理层的原始比特流进行界定,数据链路层也能够对帧的丢失进行处理。

  • 网络层

    网络层涉及源主机节点到目的主机节点之间可靠的网络传输,它需要完成的功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。

  • 传输层

    传输层起着承上启下的作用,涉及源端节点到目的端节点之间可靠的信息传输。传输层需要解决跨越网络连接的建立和释放,对底层不可靠的网络,建立连接时需要三次握手,释放连接时需要四次挥手

  • 会话层和表示层

    会话层的主要功能是负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工3种不同的通信方式,使系统和服务之间有序地进行通信。

    表示层关心所传输数据信息的格式定义,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。

  • 应用层

    应用层为OSI的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。

三、TCP协议

1、TCP协议
  • TCP:TCP(英语:Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。
    • 通常用于互联网协议,被称 TCP / IP。
    • TCP/IP,即Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,是Internet最基本的协议、Internet国际互联网络的基础。
⭐️补充知识点:TCP/IP参考模型 和OSI模型的区别

TCP/IP协议是一个开放的网络协议簇,它的名字主要取自最重要的网络层IP协议和传输层TCP协议

  • 应用层

    应用层为Internet中的各种网络应用提供服务。 TCP的应用层整合了OSI的应用层、表示层、会话层

  • 传输层

    TCP层负责在应用进程之间建立端到端的连接和可靠通信,TCP层涉及两个协议,TCP和UDP。

    • TCP协议提供面向连接的服务,提供按字节流的有序、可靠传输。
    • UDP协议提供无连接的服务,用于不需要或无法实现面向连接的网络应用中。
    • 具体区别见思考题
  • 互联网层

    互联网层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。

  • 网络接口层

    TCP/IP协议对网络接口层没有给出具体的描述,网络接口层对应着物理层和数据链路层。

2、Socket套接字

Java控制网络类似jdbc

  • java写网络代码,需要接口或实现类——

    C语言、java、Python语言,都有通用的接口:socket(套接字,网路通用的编程接口)

  • socket套接字:网络通用的编程接口,美国伯克利大学发明

  • 需要用的包:java.net

在编写程序时,要模仿两个程序相互接受信息,那么就需要创建两个项目工程

Socket,本质上就是一组接口,是对TCP/IP协议的封装和应用(程序员层面上)。

3、IDEA具体操作

在IDEA内创建两个项目工程——模块Module——>实现一个项目工程下有两个模块(项目工程下没有src,在模块下才有src)

  1. 先关闭所有的Project

  2. 选择创建空的工程 Empty Project

  3. 进入工程结构设置 Project Structure

  4. 点击添加模块Module——Add

    • 分别创建服务端Server和客户端Client

    • 注意:创建新模块时,目录要选择在工程文件目录下新建

  5. 检查:项目工程下没有src,在模块下才有src

四、搭建简单的客户端和服务端Demo

1、连接的思路整理
  1. Server建立服务
  2. Client请求连接服务器
  3. Server接受连接请求 —— 两边的连接对象建立连接通道
    • 当存在多个Client连接时,服务端就需要建立多个连接对象
  4. 双方就可以进行数据的接发交互——用到IO流
  5. 关闭连接
2、创建服务器
  1. 1️⃣——创建端口 ServerSocket——套接字接口,需要在实例化时,确定端口。

    ServerSocket serverSocket = new ServerSocket(10086);	// 端口自定义
    System.out.println("创建服务,等待连接。。。");
    
    • 简单理解,电脑ip地址就像房子,端口就像
    • 端口用两个字节长的数组表示,长度大概6万多,数字较小的端口基本都被使用了,端口号越大越安全。
    • 上网固定端口:80 / mysql的端口 3306
    • 如何查看那些端口被使用了?
      • cmd指令netstat
  2. 3️⃣——(接受请求)同意连接 :成员方法accept(),返回值为Scokect

    Socket socket = serverSocket.accept();
    System.out.println("同意连接。。。");
    
  3. 4️⃣——接受数据,将原始的输入流,转换为方便的封装流

    // 5接受数据
    // 获取原始的字节流
    InputStream inputStream = socket.getInputStream();
    // 转换为原始的字符流
    Reader reader = new InputStreamReader(inputStream);
    // 转换为封装流
    BufferedReader bufferedReader = new BufferedReader(reader);
    // 存在一个问题: 如何判断需要接受多少数据?——通过换行符
    String lineStr = bufferedReader.readLine();
    System.out.println("接收到的数据为"+lineStr);
    
    System.out.println("====服务端发送数据");
    OutputStream outputStream = socket.getOutputStream();
    // 转字符
    Writer writer = new OutputStreamWriter(outputStream);
    // 转封装
    PrintWriter printWriter = new PrintWriter(writer);
    printWriter.println("返回发送的测试数据123");
    // 刷新
    printWriter.flush();
    
  4. 5️⃣——关闭端口,*单次连接不需要,*但是在循环中,就需要用到关闭

3、创建客户端
  1. 2️⃣——建立连接(发出请求)——需要两个参数:服务器IP地址,端口,如:

    System.out.println("开始连接。。。");
    // IP地址为本地,端口要和服务器端口一样
    Socket socket = new Socket("127.0.0.1",10086); 
    System.out.println("连接成功。。。");
    
  2. 4️⃣——发送数据,IO流提供了最原始的介质流,将字节流转换为字符流,字符流再转换为封装流

    // 先获得原始的字节输出流
    OutputStream outputStream = socket.getOutputStream();
    // 将字节流转换为字符流
    Writer writer = new OutputStreamWriter(outputStream);
    // 将原始的字符流,转换为好用的封装流
    PrintWriter printWriter = new PrintWriter(writer);
    // 刷新缓存
    printWriter.flush(); 
    
    System.out.println("====开始接受数据");
    InputStream inputStream = socket.getInputStream();
    Reader reader = new InputStreamReader(inputStream);
    BufferedReader bufferedReader = new BufferedReader(reader);
    String lineStr = bufferedReader.readLine();
    System.out.println("接受到的内容是");
    System.out.println(lineStr);
    
4、建立可以多次互通的连接
  • 服务器端:被动的
    • 使用while循环
    • 结束的条件:一般设定为Reader读取到为null时(当没有数据可读时),退出循环
  • 客户端:主动的
    • 使用Scanner或者其他,提醒用户输入的内容
  • 连接要求:
    • 要求在同一个局域网下(热点
    • IP地址,是否联通,用ping命令
    • 关闭防火墙(自带,360等软件
  • 了解Socket方法可以获得对方ip地址等信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xcong_Zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值