【从零开始学习JAVA | 第四十二篇】初学网络编程

news2024/12/22 23:53:53

目录

前言:

什么是网络编程:

网络编程的应用场景:

常见的软件架构: 

CS架构:

BS架构:

网络编程三要素:​

总结:


前言:

        当今互联网已经渗透到我们日常生活的方方面面,而网络编程作为其中一项重要技术,正发挥着关键作用。Java作为一种广泛应用的编程语言,在网络编程领域也有着卓越的表现和丰富的支持。

        Java网络编程为开发者提供了强大的工具和库,使他们能够轻松地构建各种网络应用程序,包括客户端和服务器端应用。通过Java的网络编程能力,我们可以实现跨平台的网络通信、数据传输、远程调用以及实时消息传递等功能。

         让我们一同踏上这段令人兴奋的网络编程之旅,探索Java技术的魅力和无限潜力。无论你是想为日常开发增添新技能,还是为未来的职业发展铺路,本文都将成为你学习和掌握Java网络编程的最佳指南。让我们开始吧!

什么是网络编程:

在Java中,网络编程是指使用Java语言和相关的API来实现各种网络应用程序的开发过程。它涵盖了建立网络连接、数据传输和通信协议等方面。 

网络编程就是在网络通讯协议下,不同计算机上运行的程序进行的数据传输 

网络编程的应用场景:

  1. 客户端-服务器通信:网络编程经常用于构建客户端-服务器模型的应用程序。客户端通过网络连接与服务器进行通信,并发送请求以获取数据或执行操作。例如,Web应用程序通过HTTP协议与服务器进行通信获取网页内容或提交表单数据。

  2. 分布式系统:网络编程用于构建分布式系统,其中多台计算机通过网络连接互相通信和协调工作。分布式系统可用于各种应用,包括大规模数据处理、并行计算、集群管理等。

  3. 实时通信:网络编程使得实时通信成为可能,可以构建即时通讯应用、视频会议软件、实时游戏等。通过网络传输数据和消息,不同用户之间可以实时地进行沟通和交互。

  4. 远程调用:网络编程允许在不同的计算机上调用远程方法或函数,实现分布式计算。远程过程调用(RPC)和Web服务是常见的远程调用技术,用于实现跨平台、跨语言的方法调用。

  5. 数据传输和共享:通过网络编程,可以实现数据在不同计算机之间的传输和共享。这在大规模数据处理、文件传输、云存储等场景中非常常见。

  6. 网络安全和加密:网络编程也与网络安全和数据加密密切相关。通过网络编程,可以实现安全的数据传输、身份验证、数据加密和解密等操作,确保通信过程中的数据安全性和机密性。

  7. 物联网(IoT):网络编程在物联网领域也发挥着重要作用。通过网络编程,可以实现物联网设备之间的通信和数据交换,从而构建智能家居、智能城市、工业自动化等应用。

 在正式学习网络编程之前,我们要先来介绍一下常见的两个软件架构:CS 和 BS

常见的软件架构: 

CS架构:

CS架构,即Client-Server架构,是一种常用的分布式计算架构,常见于计算机网络中。它通过将系统划分为客户端服务器两个部分来实现系统功能的分布与协作。

需要用户在本地下载并安装客户端程序,在远程有一个服务器端程序

在CS架构中,客户端是指用户使用的终端设备,如个人电脑、手机或平板电脑等,它们通过网络与服务器进行通信。客户端负责发送请求、接收和显示服务器返回的数据,提供用户界面和交互功能。

而服务器则是中央控制单元,负责处理和响应客户端发送的请求。服务器可以是一台独立的计算机,也可以是由多个计算机集群组成的系统。它运行着网络应用程序,接收客户端请求并进行处理,然后将处理结果发送回客户端。

CS架构的特点有以下几点:

  1. 分布式:客户端和服务器可以运行在不同的设备上,通过网络进行通信,使系统的功能和负载可以分布在不同的机器上,提高系统的可伸缩性和性能。
  2. 中心化:服务器作为中心控制单元,负责处理和管理客户端的请求和数据,实现对整个系统的统一管理,易于维护和调试。
  3. 松耦合:客户端和服务器之间通过约定的协议进行通信,彼此独立,可以独立进行升级和改进,不影响对方的功能和稳定性。
  4. 高效性:服务器可以集中处理大量的请求和数据,实现高效的资源共享和任务分配,提高系统的并发处理能力和响应速度。

CS架构被广泛应用于各种互联网应用,如网站、电子商务系统、社交媒体等,它提供了一种有效的方式来实现分布式计算和服务。

优点:

  1. 分布性:CS架构将系统划分为客户端和服务器两个部分,可以将系统的功能和负载分布在不同的机器上,提高了系统的可伸缩性和性能。
  2. 中心化管理:服务器作为中心控制单元,负责处理和管理客户端的请求和数据,实现对整个系统的统一管理和控制,易于维护和升级。
  3. 松耦合:客户端和服务器通过约定的协议进行通信,彼此独立,可以独立进行升级和改进,不影响对方的功能和稳定性。
  4. 高效性:服务器集中处理大量的请求和数据,实现高效的资源共享和任务分配,提高系统的并发处理能力和响应速度。

缺点:

  1. 单点故障:CS架构中,服务器是系统的核心,如果服务器出现故障或不可用,将导致整个系统无法正常运行,有单点故障的风险。
  2. 通信开销:由于客户端和服务器之间通过网络通信,存在一定的通信开销,特别是在跨网络或远程通信时,可能会增加延迟和网络负载。
  3. 难以实现实时性:在CS架构中,客户端发起请求后需要等待服务器响应,这种请求-响应的模式使得实时性要求较高的应用难以实现。

BS架构:

BS架构,即Browser-Server架构,是一种常见的分层架构,也是互联网应用中常用的架构模式之一。

需要用户使用浏览器进行页面访问,客户访问不同的服务器

在BS架构中,客户端是通过浏览器来访问和使用应用程序,而服务器负责处理客户端发送的请求并发送响应。客户端与服务器之间通过网络进行通信。

BS架构的特点有以下几点:

  1. 分层架构:BS架构将系统分为两个层次,即客户端层和服务器层。客户端层包括用户使用的浏览器,负责显示用户界面和提供用户交互。服务器层负责处理和管理数据、逻辑处理以及与数据库的交互等。
  2. 中心化:服务器作为中心控制单元,负责数据和业务逻辑的处理。客户端通过浏览器发送请求,服务器接收请求并做出响应,实现了系统的集中管理和控制。
  3. 跨平台:由于客户端使用的是浏览器,不依赖于特定的操作系统或设备,使得应用可以在不同平台上运行,并且无需额外的安装或更新。
  4. 统一界面:BS架构中,用户通过浏览器访问应用程序,无论是在PC上还是在移动设备上,提供了统一的界面和用户体验。
  5. 简化客户端:客户端只需要具备浏览器和网络连接即可,无需安装复杂的应用程序,减轻了客户端的负担。

BS架构的一个典型应用是Web应用程序,如网站、电子邮件服务、在线办公套件等。它的优点包括易于部署和维护、跨平台支持、减少客户端的依赖和复杂性等。然而,由于大部分业务逻辑在服务器端处理,可能会增加服务器的压力,并且对网络连接的质量和稳定性有一定要求。

优点:

  1. 跨平台:BS架构通过使用浏览器作为客户端,可以在不同的操作系统和设备上实现应用程序的访问,无需针对不同平台开发和维护多个客户端版本,提高了开发效率。
  2. 简化客户端:由于客户端主要是浏览器,不需要安装复杂的应用程序,大部分功能都由服务器端完成,减少了用户设备的资源占用和复杂性。
  3. 集中控制和管理:BS架构将核心的数据和业务逻辑集中在服务器端,使得系统的管理和维护更加集中和便捷,可以快速进行升级和改进。
  4. 统一界面和体验:所有的用户界面和操作都通过浏览器完成,提供了统一的界面和用户体验,减少了用户的学习成本和适应时间。

缺点:

  1. 对网络连接和带宽有要求:BS架构的应用程序需要通过网络连接服务器进行访问和操作,对网络连接的质量和稳定性有一定要求,如果网络不稳定或带宽有限,可能导致用户体验下降。
  2. 服务器压力增加:由于大部分业务逻辑在服务器端处理,服务器需要承担更多的计算和处理工作,需要具备足够的性能和扩展性,否则可能会面临性能瓶颈或不稳定性。
  3. 依赖服务器:BS架构中,系统的核心功能和数据都存储在服务器端,如果服务器出现故障或不可用,将导致用户无法访问或使用系统。
  4. 隐私和安全问题:由于用户数据和敏感信息存储在服务器端,对服务器的安全性要求较高,需要采取相应的安全措施保护用户数据的隐私和系统的安全。

网络编程三要素:

  1. IP地址(Internet Protocol Address):IP地址是网络上用于标识和定位设备的唯一标识符。IPV4由4个字节构成,通常以点分十进制(就是把四个字节分别表示为数字)表示(如192.168.0.1)。在网络编程中,IP地址用于标识要连接的目标主机或者监听的网络接口。

  2. 端口号(Port Number):端口号用于标识一个具体的应用程序或服务。它是一个16位的数字,范围从0到65535。其中,0到1023被保留为常用的众所周知端口,用于一些特定的服务,如HTTP的80端口,HTTPS的443端口等。在网络编程中,客户端和服务器通过不同的端口号来进行通信和区分。

  3. 协议(Protocol):协议定义了网络通信中的规则和约定。常见的网络协议有TCP(Transmission Control Protocol)、UDP(User Datagram Protocol)和HTTP(Hypertext Transfer Protocol)等。TCP提供可靠的、面向连接的通信,适用于要求可靠传输的应用;UDP提供无连接的通信,适用于实时性要求较高的应用;HTTP是一种应用层协议,用于在Web上传输超文本和其他数据。

这三个要素在网络编程中起着重要的作用,客户端和服务器通过IP地址和端口号建立连接,使用特定的协议进行通信,实现数据的交互和传输。网络编程中的其他概念和技术,例如套接字(Socket)、HTTP请求和响应、网络传输层等,都是围绕着这三个要素展开的。

我们要着重介绍一下协议中的UDP协议和TCP协议,建议各位直接背过:

UDP协议:

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议
  • 速度快,有大小限制,一次最多发送64K,数据不安全,容易丢失

UDP协议的工作原理如下:

  1. 应用程序将要传输的数据分割成较小的数据包(数据报)。
  2. 数据报添加UDP协议头部,包含源端口和目标端口等信息。
  3. 将数据报发送给目标主机。
  4. 接收方根据UDP头部的端口信息将数据报交给相应的应用程序进行处理。
  5. 接收方不发送任何确认回复,也不进行重传等错误处理。

UDP协议适合于对实时性要求较高、数据可靠性要求不高的应用场景,比如实时视频传输、音频流媒体等。在这些场景下,稍微丢失一些数据也不会对应用的执行产生太大影响。

public class UDPtest {
    public static void main(String[] args) {
        // 启动服务器端
        new Thread(new UDPServer()).start();
        // 启动客户端
        new Thread(new UDPClient()).start();
    }
}

class UDPServer implements Runnable {
    @Override
    public void run() {
        try {
            // 创建服务器端Socket对象,监听指定端口号
            DatagramSocket serverSocket = new DatagramSocket(8888);

            byte[] receiveData = new byte[1024];

            while (true) {
                // 创建接收数据包
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

                // 接收数据
                serverSocket.receive(receivePacket);

                // 解析接收到的数据
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Server received: " + message);

                // 发送响应数据
                InetAddress IPAddress = receivePacket.getAddress();
                int port = receivePacket.getPort();
                String responseMessage = "Hello, client!";
                byte[] sendData = responseMessage.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                serverSocket.send(sendPacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class UDPClient implements Runnable {
    @Override
    public void run() {
        try {
            // 创建客户端Socket对象
            DatagramSocket clientSocket = new DatagramSocket();

            // 设置服务器端IP地址和端口号
            InetAddress IPAddress = InetAddress.getByName("localhost");
            int port = 8888;

            // 发送数据
            String message = "Hello, server!";
            byte[] sendData = message.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            clientSocket.send(sendPacket);

            // 创建接收数据包
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

            // 接收数据
            clientSocket.receive(receivePacket);

            // 解析接收到的数据
            String responseMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Client received: " + responseMessage);

            // 关闭Socket连接
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TCP协议:

  • 传输控制协议TCP(Transmission Control Protocol )
  • TCP是面向连接的通讯协议
  • 速度慢,没有大小限制,数据安全

TCP协议的工作原理如下:

  1. 发起连接:发送方向接收方发送一个SYN(同步)包,接收方收到后回复一个SYN+ACK包,发送方再回复一个ACK包,完成连接的建立。
  2. 数据传输:连接建立后,发送方将数据分割成较小的数据段,并添加TCP头部信息,包括序列号、确认号等。发送方将数据段发送给接收方。
  3. 数据确认:接收方收到数据段后会发送确认应答ACK,表示接收到了这个数据段;发送方收到ACK后才会发送下一个数据段。
  4. 拥塞控制:如果网络中出现拥塞,接收方会通过拥塞窗口进行流量控制,发送方会根据接收到的ACK进行拥塞窗口的调整,避免造成网络拥塞。
  5. 连接关闭:当数据传输完毕后,发送方和接收方可以发起连接的关闭。发送方发送一个FIN包,接收方收到后回复一个ACK包,然后发送一个FIN包,最后发送方回复一个ACK包,完成连接的关闭。

TCP协议适用于对数据可靠性和有序性要求较高的应用场景,比如文件传输、电子邮件、网页浏览等。虽然TCP协议的开销较大,但其可靠性和有序性使得数据可以按照正确的顺序传输,并且可以确保数据没有丢失和损坏。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClientServer {
    public static void main(String[] args) {
        // 启动服务器端
        new Thread(new TCPServer()).start();
        // 启动客户端
        new Thread(new TCPClient()).start();
    }
}

class TCPServer implements Runnable {
    @Override
    public void run() {
        try {
            // 创建服务器端Socket对象,监听指定端口号
            java.net.ServerSocket serverSocket = new java.net.ServerSocket(8888);

            while (true) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("Server connected");

                // 获取输入流和输出流
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

                // 读取客户端发送的数据
                String message = in.readLine();
                System.out.println("Server received: " + message);

                // 发送响应数据
                String responseMessage = "Hello, client!";
                out.println(responseMessage);

                // 关闭连接
                clientSocket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class TCPClient implements Runnable {
    @Override
    public void run() {
        try {
            // 创建客户端Socket对象,连接服务器
            Socket clientSocket = new Socket("localhost", 8888);
            System.out.println("Client connected");

            // 获取输入流和输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            // 发送数据
            String message = "Hello, server!";
            out.println(message);

            // 读取服务器端发送的响应数据
            String responseMessage = in.readLine();
            System.out.println("Client received: " + responseMessage);

            // 关闭连接
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结:

        今天我们对于网络编程的介绍就到此为止,后面我们会再详细的介绍一下网络编程中的其他知识点,网络编程的知识很多很杂,因此我们要多加记忆,这样才可以熟练的掌握网络编程

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

目录 一、导入依赖与配置信息 二、导入测试数据创建实体类 三、插入数据 1、Insert默认集合插入 2、Insert指定集合插入 3、Insert批量插入数据 4、save默认集合插入 5、save指定集合插入 6、insert与save的区别 四、修改数据 1、修改符合条件的第一条数据 2、全…

单例模式-java实现

介绍 单例模式的意图:保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图:一般的单例的实现,是属性中保持着一个自己的私有静态实例引用,还有一个私有的构造方法,然后再开放一个静态的获取实例的方法给外界…

golang内存对齐

为什么要内存对齐? CPU访问内存时,以CPU的位数为单位进行访问。 如果访问未对齐的内存,处理器需要做两次内存访问,对齐的内存的访问可能仅需要一次,利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…

MySql学习3:常用函数

常用字符串函数 CHAR_LENGTH(s):返回字符串的长度 select *, char_length(name) as nameLength from emp;CONCAT(s1,s2…sn):字符串拼接 select name,concat(name,入职时间:,entrydata) as 入职时间 from emp;CONCAT_WS(x, s1,s2…sn)&a…

24v转3.3v输出3A用什么芯片

问:客户需要一个能够将24V输入电压转换为3.3V输出电压,并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗?(vin24v、5v,vout3.3v,Io1-3A) 答:推荐使用…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏,可发布PC、Andoid、IOS、Web等 下载地址:https://download.csdn.net/download/Highning0007/88189987

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后,后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容,如页脚、页眉、菜单等。为了做到这一点&a…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言: ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块: 同步方法: 死锁: 4.生产者和消费者模式(等待唤醒机制) 总结: 前言: 当今软件开发领…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Echart(v5)实现中国地图区域图

一、需求背景 需要实现一个中国地图的区域图(区域级别到市),并且指定区域可以高亮。 二、相关工具 1、中国的GeoJSON数据获取:DataV.GeoAtlas地理小工具系列 2、Echart组件库 Apache ECharts 三、实现 echart配置: …

MySQL查看当前数据库视图-SQL语句

引言 查询语句为: show full tables where table_type 可查询当前数据库表 一,创建一个视图 # 创建视图 create view v_stu as # 视图内容(连接的一个表) select name from t_stu union all select tname from t_teach; 二&…

RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V

注释:编译Fedora,HS-2 64核RISC-V服务器比Ryzen5700x快两倍! --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…

2.4 网络安全新技术

数据参考:CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池,并按需自助获取和管理资源的模式。在云计算中,计算资…

Goland搭建远程Linux开发

Windows和Linux都需要先构建好go环境,启用ssh服务。 打开Windows上的Goland,建立项目。 点击添加配置,选择go构建 点击运行于,选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…

AIGC自动生成内容真的好吗

一、前言 博主认为某些技术领域的发展对人类而言,并没有多大的益处。反而让人类更加困扰。纵观这几十年的技术发展,日新月异,但是人类生活的幸福指数并没有提高,反而产生了无数的社会问题。 AI大模型迅速发展,A…

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程,所以,本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…

FirmAE 模拟固件

一、介绍 FirmAE目标是创造一个可以供用户动态调试分析的环境,而不是复现和硬件一模一样的环境,,其卖点是大规模(Large-Scale)。 论文开头就直指“友商”Firmadyne,提出其模拟成功率低等问题, 其将原本Firmadyne的成功率16.28%提高…

Navicat 导出excel表数据结构

效果展示: 实现过程: 1 打开Navicat 执行以下SQL,注意:将以下SQL中的数据库名称和表名称替换。 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, C…

代码随想录算法学习心得 50 | 739.每日温度、496.下一个更大元素I...

一、每日温度 链接:力扣 描述如下:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高&…

pytest自动化测试框架之标记用例(指定执行、跳过用例、预期失败)

pytest中提供的mark模块,可以实现很多功能,如: 标记用例,即打标签skip、skipif标记跳过,skip跳过当前用例,skipif符合情况则跳过当前用例xfail标记为预期失败 标记用例 有时候我们可能并不需要执行项目中…