计算机网络-----网络编程

2023-11-15

网络基础

1.什么是计算机网络?

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2.什么是网络编程?

网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,现在的网络编程基本上都是基于请求 / 响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

3.网络编程中的主要问题

1.如何准确定位网络上的一台或多台主机,定位主机上的特定的应用;
2.找到主机后如何可靠高效地进行数据传输。

4.网络通信要素

  1. 通信双方地址:IP 和 端口号;
  2. 网络通信模型:OSI参考模型 ;TCP/IP参考模型。
  3. 网络通信协议:计算机网络中实现通信必须遵循的一点的规则约定,这些规约对传输的速率,传输代码,代码结构,传输控制步骤,出错控制步骤等制定了标准。

5.通信协议分层思想

在制定通信协议时,把复杂成分分解成一些简单成分,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信,上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,有利于系统的开发和扩展。

网络的分层图示如下:
加粗样式
上图中,TCP/IP协议中的四层分别是应用层传输层网络层链路层,每层分别负责不同的通信功能。

  1. 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
  2. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
  3. 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
  4. 数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

我们编写的程序位于应用层,因此我们的程序是和TCP/UDP打交道的~~

IP和端口号

1. IP

1.1定义

互联网协议地址(Internet Protocol Address),缩写为IP地址(IP Address),是分配给用户上网使用的网际协议设备的数字标签,唯一的标识Internet上的计算机(通信实体)。

1.2IP的分类

分类1:IPV4 (长度为 32 位,4 个字节)和 IPV6(长度为 128 位,16 个字节);
分类2:公网地址(万维网使用)和 私有地址(局域网使用, 本地回路地址:127.0.0.1)。

参考代码:

public class Test_InetAddress {
    public static void main(String[] args) {
        try {
            InetAddress inetAddress_1 =  InetAddress.getByName("192.168.10.14");
            System.out.println(inetAddress_1);
            //我们也可以由 域名 获取 IP
            InetAddress inetAddress_2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress_2);
            //获取本机IP地址
            InetAddress inetAddress_3 = InetAddress.getLocalHost();
            System.out.println(inetAddress_3);//我们发现结果不是170.0.0.1,是因为我们在局域网内~~
           
            //实例化InetAddress的两个方法:
            //获取域名,getHostName()
            System.out.println(inetAddress_2.getHostName());
            //获取IP地址
            System.out.println(inetAddress_2.getAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

2.端口号

2.1定义

我们此处所说的端口号是逻辑意义上的端口,一般指TCP/IP协议中的端口,它标识了正在计算机上运行的进程,不同的进程有着不同的端口号,范围是0 ~ 65 535。

2.2端口号的分类

可以将端口按照端口号分为以下三类:

  1. 公认端口(0~1023):它们紧密绑定于一些服务。通常这些端口的通信明确表明了某种服务的协议。
  2. 注册端口(1024~ 49151):它们松散的绑定于一些服务。也就是说有许多服务绑定于这些端口,但是这些端口同样用于许多其他目的。例如,许多系统处理动态端口是从1024左右开始的。
  3. 动态/私有端口(49152~65535):理论上,不应该为服务器分配这些端口。实际上机器通常从1024起分配动态端口。但是也有例外,SUN的RPC端口就是从32768开始。

端口号与IP地址的组合得出一个网络套接字:Socket

网络通信协议

1.TCP/IP协议簇

传输层协议中有两个非常重要的协议:传输控制协议(TCP)和 用户数据报协议(UDP)。

TCP/IP 以其两个主要的协议 传输控制协议(TCP)和 网络互助协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。

IP协议(Internet Protocol):该协议是网络层的主要协议,支持网络之间的数据通信。

2.TCP 和 UDP

TCP协议工作流程:

  1. 使用TCP协议前,需先建立TCP连接,形成传输数据通道;
  2. 传输前,采用“三次握手”方式,点对点通信,是可靠的;
  3. TCP协议进行通信的两个应用进程:客户端和服务端;
  4. 在连接中可进行大量数据的传输
  5. 传输完毕,需释放已建立的连接,效率低下。

TCP三次握手示意图:
在这里插入图片描述
TCP四次挥手示意图:
在这里插入图片描述

UDP协议工作流程:

  1. 将数据,流,目的封装成数据包,不需要建立连接
  2. 每个数据包的大小限制在64K内
  3. 发送时不管对方是否准备好接受,接受方收到后也不进行确认,故不可靠
  4. 可以广播发送;
  5. 发送数据结束时,无需释放资源,开销小,速度快

3.实现TCP的网络编程

例一、客户端发送信息给服务端,服务端接收信息打印在控制台。

参考代码:

public class test_TCP_1 {
    //客户端
    @Test
    public void client(){
        Socket socket = null;//socket封装了IP地址和端口
        OutputStream outputStream = null;
        try {
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inetAddress,6899);
            outputStream = socket.getOutputStream();
            outputStream.write("你好!我是客户端!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    //服务器端
    @Test
    public void server(){
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            serverSocket = new ServerSocket(6899);
            socket = serverSocket.accept();
            inputStream = socket.getInputStream();

            //不建议下面的操作,因为会导致乱码
//            byte[] buffer = new byte[20];
//            int len;
//            while((len = inputStream.read(buffer)) != -1){
//                String string = new String(buffer,0,len);
//                System.out.println(string);
//            }

            //建议操作
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[5];
            int len;
            while((len = inputStream.read(buffer)) != -1){
                byteArrayOutputStream.write(buffer,0,len);
            }
            System.out.println(byteArrayOutputStream.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (byteArrayOutputStream != null){
                    byteArrayOutputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (inputStream != null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (serverSocket != null){
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:(要注意先运行服务器端程序,在运行客户端程序~~~)
在这里插入图片描述

例二、客户端发送文件给服务端,服务端将文件保存到本地。

参考代码:

public class test_TCP_2 {
    //客户端
    @Test
    public void client(){
        Socket socket = null;
        OutputStream outputStream = null;
        FileInputStream fileInputStream = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
            outputStream = socket.getOutputStream();
            fileInputStream = new FileInputStream(new File("src\\IU.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len = fileInputStream.read(buffer)) != -1){
                outputStream.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null){
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //服务端
    @Test
    public void server(){
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStream inputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            serverSocket = new ServerSocket(9090);
            socket = serverSocket.accept();
            inputStream = socket.getInputStream();
            fileOutputStream = new FileOutputStream(new File("IUIU.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len = inputStream.read(buffer)) != -1){
                fileOutputStream.write(buffer,0,len);
            }
            System.out.println("传输完成!!!请及时查看!!!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null){
                    fileOutputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (inputStream != null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (serverSocket != null){
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:
在这里插入图片描述

例三、客户端给服务端发送文件,服务端保存文件到本地,并返回“发送成功”提示给客户端,最后关闭服务。

参考代码:

public class test_TCP_2 {
    //客户端
    @Test
    public void client(){
        Socket socket = null;
        OutputStream outputStream = null;
        FileInputStream fileInputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
            outputStream = socket.getOutputStream();
            fileInputStream = new FileInputStream(new File("src\\IU.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len = fileInputStream.read(buffer)) != -1){
                outputStream.write(buffer,0,len);
            }
            socket.shutdownOutput();//关闭数据传输
            //客户端接受来自服务器端的数据并显示到控制台~~
            InputStream inputStream = socket.getInputStream();
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer1 = new byte[5];
            int len1;
            while((len1 = inputStream.read(buffer1)) != -1){
                byteArrayOutputStream.write(buffer1,0,len1);
            }
            System.out.println(byteArrayOutputStream.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null){
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (byteArrayOutputStream != null){
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    //服务端
    @Test
    public void server(){
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStream inputStream = null;
        FileOutputStream fileOutputStream = null;
        OutputStream outputStream = null;
        try {
            serverSocket = new ServerSocket(9090);
            socket = serverSocket.accept();
            inputStream = socket.getInputStream();
            fileOutputStream = new FileOutputStream(new File("IUIU.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while((len = inputStream.read(buffer)) != -1){
                fileOutputStream.write(buffer,0,len);
            }
            //服务器端给客户端反馈~~
            outputStream = socket.getOutputStream();
            outputStream.write("你好,客户端!文件已收到!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null){
                    fileOutputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (inputStream != null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null){
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (serverSocket != null){
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

运行结果:
在这里插入图片描述

4.实现UDP的网络编程

在这里插入图片描述

例一、发送端发送信息,接收端接收信息并打印到控制台。

参考代码:

public class test_UDP_1 {
    //发送端
    @Test
    public void sender() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        String string = "这是以UDP方式发送的数据!!!";
        byte[] data = string.getBytes();
        InetAddress inetAddress = InetAddress.getLocalHost();
        //下面一行代码相当于封装了一个数据报~~
        DatagramPacket datagramPacket = new DatagramPacket(data,0,data.length,inetAddress,9090);
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }

    //接收端
    public void receiver() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9090);
        byte[] buffer = new byte[100];
        DatagramPacket datagramPacket = new DatagramPacket(buffer,0,buffer.length);
        datagramSocket.receive(datagramPacket);
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        datagramSocket.close();
    }
}

运行结果:
在这里插入图片描述

5.URL网络编程

在这里插入图片描述
URL类常用的方法:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络-----网络编程 的相关文章

随机推荐

  • VUE项目本地运行调试遇到问题,npm run,install 报错

    IDE 随意选择 太多了 VSCode webstorm 一 安装node js npm vue cli 这三个东西教程挺多的 我这里就不详细说了 我之前开发的时候安装过 查看当前电脑上有没有安装 注意V的大小写 node v npm v
  • Vue.js怎么给文本域赋默认值,和获取输入的值

    Vue js怎么给文本域赋默认值 一般给文本域赋初值用于修改某个东西 需要获取默认值 可以用v model来完成
  • Sublime Text 3 文本编辑器软件

    为什么80 的码农都做不了架构师 gt gt gt http www xiazaiba com html 24343 html Sublime Text 2 设置文件详解 http linux cn article 799 1 html S
  • 45类商标分类表明细表

    商标注册分类采用的是尼斯分类 尼斯联盟成员国采用 商标注册用商品和服务国际分类 尼斯分类将商品和服务分成45个大类 其中商品为1 34类 服务为35 45类 商标局将尼斯分类的商品和服务项目划分类似群 并结合实际情况增加我国常用商品和服务项
  • SpringBoot使用多数据源时怎么解决事务不生效问题

    在使用多数据源时 如果不进行特殊处理 可能会出现事务不生效的问题 这是因为 Spring Boot 默认只会为一个数据源创建一个事务管理器 如果要使用多个数据源 就需要为每个数据源创建一个事务管理器 并在需要使用事务的方法或类上指定使用哪个
  • Istio Pilot源码学习(二):ServiceController服务发现

    本文基于Istio 1 18 0版本进行源码学习 4 服务发现 ServiceController ServiceController是服务发现的核心模块 主要功能是监听底层平台的服务注册中心 将平台服务模型转换成Istio服务模型并缓存
  • linux环境下设置用户密码过期期限

    关于密码过期时间和用户过期时间的设置 通常使用chage命令和usermod命令 设置某个用户的过期时间 accountexpires 可以用usermod e来设置 查看某个用户的密码 passwordexpires 过期时间等信息 可以
  • Java里Controller层参数不必填

    public Result
  • KNN算法的一个回归应用分析

    介绍 在我所接触的机器学习算法中 KNN是一种相对来说较容易理解的算法 但是它在实际中仍有十分广泛的应用 KNN算法可以用于分类和回归问题 在分类问题中应用较多 虽然KNN很少用于回归问题 但对于连续的变量仍有很好的效果 下面我们来介绍KN
  • 一篇打通,pytest自动化测试框架详细,从0到1精通实战(一)

    前言 pytest单元测试框架 1 什么是单元测试框架 单元测试是指在软件开发当中针对软件的最小单位 函数 方法 进行正确性的检查测试 2 单元测试框架有哪些 Java junit 和 testing python unittest 和 p
  • 整理了一些常用的免费api接口,不限次数,收藏备用~(持续更新...)

    API Application Program Interface 被定义为应用程序可用以与计算机操作系统交换信息和命令的标准集 一个标准的应用程序界面为用户或软件开发商提供一个通用编程环境 以编写可交互运行于不同厂商计算机的应用程序 AP
  • ISP_matlab

    确定输入是否为结构体数组字段 MATLAB isfield MathWorks 中国 对话框打开文件 获取路径和文件名 file path uigetfile raw RAW fid fopen fullfile path file htt
  • 百度通用翻译api使用

    官方api文档 http api fanyi baidu com api trans product apidoc springboot demo地址 https github com Blankwhiter translate 第一步 注
  • python web界面模板_Python简单轻量级Web Server模块Bottle

    Bottle 提示 使用此WEB服务器模块需要有基本的HTTP知识 简单 轻量级指的是 上手不难 容易使用 模块不大还能完成一般Web服务器的功能 Bottle是Python平台的轻量级Web Server 准确的说是HTTP Server
  • node.js在idea里运行

    Node js 是一种运行在 Chrome V8 JavaScript 引擎上的基于 JavaScript 的客户端运行时 JavaScript runtime 它可以用于构建网络应用程序和服务 在 Node js 中 你可以使用多种构建工
  • 从数据库字符串中获取数字部分,用于数据分析

    目录 前言 一 思路 1 获取字符串中的小数及整数部分 代码 效果 解析 2 获取字符串中数字部分 代码 效果 解析 二 总结 前言 在大数据时代 我们经常要分析很多非结构化的数据 同时也要分析很多非标准的数据 如 0 78吨 CYJ23w
  • 【数据结构 001】 定义

    数据 能被计算机处理 能被计算机识别 能输入计算机 数据元素 有一定意义的基本单位 数据项 数据元素的组成单位 认为是数据结构中最小组成单位 数据对象 具有相同性质的数据元素的集合 数据结构 存在特定关系的数据的集合 数据之间特定的结构关系
  • 线性表(C++实现)

    线性表的定义与基本操作 定义 具有相同数据类型的n个数据元素的有限序列 n是表长 当n为0的时候线性表是一个空表 如果用L命名线性表 那么其一般表示为 L a 1
  • 山谷 蓝桥杯

    问题描述 给定一个字母矩阵 如果矩阵中的某个位置不在四条边上 而且该位置上的字母小于其上下左右四个位 置的字母 则称为一个山谷 例如 对于如下矩阵 DDDDD CADCE FFFFA 共有两个山谷 位于第二行第二列和第四列 请注意第二行第三
  • 计算机网络-----网络编程

    网络编程 实战 网络基础 1 什么是计算机网络 2 什么是网络编程 3 网络编程中的主要问题 4 网络通信要素 5 通信协议分层思想 IP和端口号 1 IP 1 1定义 1 2IP的分类 2 端口号 2 1定义 2 2端口号的分类 网络通信