# 网络编程 - 轻松入门不含糊

                                                        网络编程 - 轻松入门

  • 介绍
           网络编程指的是,在网络通信协议下。实现 不同计算机之间 的数据传输,例如 通信、聊天、视频通话 等。

1. 网络编程概述

       学习网络编程过程 中我们可以将网络编程理解为
               计算机之间的数据交互 但 前提是通过 网络协议

  • 通信协议
           规范数据交互的规则。

  • IP地址
           计算机唯一标识,就像“收件人地址”和“寄件人地址”,负责指引数据的传输路径。

  • 端口号
           应用程序的唯一标识。

  • 通信方式

    1. TCP(传输控制协议)
             面向连接,提供安全可靠 的数据传输,代价是 性能开销较高。
    2. UDP(用户数据报协议)
             无连接,更高效,代价是 可靠性较低。

2. 软件架构

① C/S 结构 (Client/Server)

  • 概念
           客户端-服务器 架构。可以理解为需要 下载 才能使用的 应用程序 所使用的架构

    在这里插入图片描述

  • 特点
           需要下载客户端应用程序。

  • 常见于
    ​        微信、QQ等。

② B/S 结构

  • 概念:浏览器-服务器架构。
  • 特点:通过浏览器访问,不需要单独安装客户端。
  • 常见场景:网页应用,如电子邮件服务。

3. 核心概念:服务器与通信协议

① 服务器

       可用于提供服务的计算机,用于处理客户端 请求 并提供 响应

  • 我们的电脑也是服务器,但是提供服务范围较小,一般是我们自己
  • 而服务器泛指范围较大的,用于托管平台,存储大量数据或支持网络应用
    1. Web服务器:提供网页浏览服务(通过 HTTP 协议)
    2. 数据库服务器:处理和管理数据存储,供客户端查询和修改。
    3. 文件服务器:提供文件存储与共享服务。
    4. 邮件服务器:管理电子邮件的发送和接收。

       服务器核心 在于接受客户端 请求 并提供 响应 的服务,这种服务是多样的

② 通信协议

       两台计算机完成数据交互需遵守通信协议:

  • TCP 协议:连接前需建立连接(三次握手),断开时需关闭连接(四次挥手),确保传输的可靠性。
  • UDP 协议:无需连接,快速但可能丢包,常用于视频通话等实时性要求较高的场景。

③ 三次握手四次挥手

       “握手”用于连接,“挥手”用于断开。以下是两者的具体过程:

  1. 三次握手(连接建立过程)
    “三次握手”指在 TCP 协议中,客户端与服务器之间建立连接的过程
    1. 第一次握手(SYN)
      客户端向服务器发送一个SYN(同步序列号)包,请求建立连接,并告诉服务器自己的初始序列号。
    2. 第二次握手(SYN-ACK)
      服务器收到SYN包后,回复一个SYN-ACK包,表示同意建立连接,同时告知自己的初始序列号。
    3. 第三次握手(ACK):
      客户端收到服务器的SYN-ACK包后,发送一个ACK包,确认服务器的序列号。此时,连接建立完成。

通过“三次握手”,双方确认了彼此的发送和接收能力

术语解释 (SYN、SYN-ACK、ACK)

  1. SYN(Synchronize:“同步”)
    可以理解为客户端向服务器发出的打招呼请求

       它的作用是发起通信请求,并告诉对方:“我准备好了,你也准备好了吗?”


  1. SYN-ACK(Synchronize-Acknowledge:“同步+确认”)
    服务器收到客户端的“打招呼”给出的回应

       它的作用是告诉客户端:“我同意通信,但需要确认你也能收到我的回应。”


  1. ACK(Acknowledge,意思是“确认”)
    是客户端收到服务器的回应后,给出的确认信息

       它的作用是告诉服务器“好的,我确认收到了你的准备,现在可以开始通信了!”
完成最后的确认,确保双方都准备好建立连接。


  1. 四次挥手(连接断开过程)
           “四次挥手”指在 TCP 协议中,客户端与服务器之间断开连接的过程
    • 第一次挥手(FIN):
             客户端发送一个FIN(终止连接)包,表示希望关闭数据传输。
    • 第二次挥手(ACK):
             服务器收到FIN包后,回复一个ACK包,表示收到了断开请求,但可能还有数据需要处理。
    • 第三次挥手(FIN):
             服务器处理完所有数据后,发送一个FIN包,表示可以断开连接。
    • 第四次挥手(ACK):
             客户端收到服务器的FIN包后,回复一个ACK包,确认连接断开。此时,连接完全关闭。

       “四次挥手”比“三次握手”多一步,是因为TCP连接是双向传输的,需要双方分别关闭自己的传输通道。

术语解释 (FIN、剩下上方已解释)

FIN(Finish:“结束”)是用来表示一方准备关闭连接的信号。

它的作用是告知对方“我已经说完了,现在想挂电话了”,并通知当前一方已经完成数据发送,准备断开连接。


4. 快速上手 UDP、TCP 网络编程程序

① Socket 套接字

**套接字Socket **

可以简单理解为:一种通信的“工具”或“接口”,用于在网络上两台计算机之间进行数据交换

  • 在编程中,它是一个“中间人”,帮助应用程序通过网络发送或接收数据。
  • 通过它,计算机之间就像打电话一样,可以 建立连接、发送消息、接收消息

打个比方

打电话给朋友 :

  • 你需要一个“电话”(套接字)才能进行交流;
  • 套接字知道对方的“电话号码”(IP 地址 + 端口号);
  • 通过这个工具,你们可以建立通信并传递信息。

所以,套接字是网络通信中应用层(程序)和传输层(协议)之间的桥梁

① UDP 编程

特点:无需建立连接,即使接收端未在线,也可发送数据。

  • 套接字类型:DatagramSocket

  • 客户端代码

// 创建 UDP 客户端,发送数据到服务器
import java.net.*;

public class UDPClient {
     public static void main(String[] args) throws Exception {
          // 1. 创建 DatagramSocket 实例
          DatagramSocket socket = new DatagramSocket();

          // 2. 准备要发送的数据
          byte[] bytes = "你好".getBytes(); // 将字符串转换为字节数组

          // 3. 指定接收端的 IP 地址和端口号
          InetAddress ip = InetAddress.getByName("127.0.0.1"); // 本地 IP 地址(回环地址)

          // 4. 创建数据报包(DatagramPacket),封装数据、目标地址和端口号
          DatagramPacket packet = new DatagramPacket(bytes, bytes.length, ip, 6666);

          // 5. 发送数据报包
          socket.send(packet);

          // 6. 关流,释放资源
          socket.close();
     }
}
  • 服务端代码
// 创建 UDP 服务端,接收客户端发送的数据
import java.net.*;

public class UDPServer {
    public static void main(String[] args) throws Exception {
        // 1. 创建 DatagramSocket 实例,并绑定到指定端口(6666)
        DatagramSocket socket = new DatagramSocket(6666);

        // 2. 准备缓冲区,用于存储接收到的数据
        byte[] bytes = new byte[1024]; // 缓冲区大小为 1024 字节

        // 3. 创建数据报包(DatagramPacket),用于接收数据
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

        // 4. 接收数据(阻塞方法,直到接收到数据为止)
        socket.receive(packet);

        // 5. 解析接收到的数据,并打印
        System.out.println(new String(packet.getData(), 0, packet.getLength())); // 转换为字符串并输出

        // 6. 关闭套接字,释放资源
        socket.close();
    }
}


② TCP 编程

特点 传输可靠,需建立连接。

  • 套接字类型 SocketServerSocket

  • 客户端代码

// 创建 UDP 服务端,接收客户端发送的数据
import java.net.*;

public class UDPServer {
     public static void main(String[] args) throws Exception {
          // 1. 创建 DatagramSocket 实例,并绑定到指定端口(6666)
          DatagramSocket socket = new DatagramSocket(6666);

          // 2. 准备缓冲区,用于存储接收到的数据
          byte[] bytes = new byte[1024]; // 缓冲区大小为 1024 字节

          // 3. 创建数据报包(DatagramPacket),用于接收数据
          DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

          // 4. 接收数据(阻塞方法,直到接收到数据为止)
          socket.receive(packet);

          // 5. 解析接收到的数据,并打印
          System.out.println(new String(packet.getData(), 0, packet.getLength())); // 转换为字符串并输出

          // 6. 关闭套接字,释放资源
          socket.close();
     }
}
  • 服务端代码
// 创建 TCP 客户端,与服务端建立连接并通信
import java.io.*;
import java.net.*;

public class TCPClient {
     public static void main(String[] args) throws Exception {
          // 1. 创建 Socket 对象,与服务端建立连接(指定服务端 IP 和端口号)
          Socket socket = new Socket("127.0.0.1", 6666); // 连接本地的 6666 端口

          // 2. 获取输出流,用于发送数据到服务端
          OutputStream os = socket.getOutputStream();
          os.write("你好,服务器".getBytes()); // 发送数据(将字符串转为字节数组)

          // 3. 获取输入流,用于接收服务端的响应
          InputStream is = socket.getInputStream();
          byte[] response = new byte[1024]; // 创建缓冲区存储响应数据
          int len = is.read(response); // 读取服务端发送的数据(阻塞方法)

          // 4. 解析响应数据,并打印
          System.out.println(new String(response, 0, len)); // 输出服务端的响应

          // 5. 关闭 Socket,释放资源
          socket.close();
     }
}

5. 小结

  1. 网络编程概述
    网络编程实现计算机之间的数据交互,依赖通信协议,核心要素包括:

    • IP地址:计算机的唯一标识。

    • 端口号:标识应用程序的入口。

    • 通信协议:TCP提供可靠连接,UDP追求高效传输。

  2. 软件架构

    • C/S架构:客户端-服务器模式,常见于微信、QQ等需安装应用的场景。

    • B/S架构:浏览器-服务器模式,适用于网页应用,如邮箱服务。

  3. 核心概念

    • 服务器:响应客户端请求的计算机,提供多样化服务(如Web、数据库)。

    • 通信协议

      • TCP:通过三次握手建立连接,四次挥手断开连接,确保传输可靠。
      • UDP:无需连接,快速高效,适合视频通话等场景。
  4. 快速上手

    • UDP编程:使用DatagramSocket快速发送数据。

    • TCP编程:基于SocketServerSocket,建立可靠连接。

end…

如果这篇文章帮到你, 帮忙点个关注呗, 不想那那那点赞或收藏也行鸭 (。•̀ᴗ-)✧ ~
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
                                                                                                                                   '(இ﹏இ`。)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP BC 同服务器不同client之间的传输SCC1

源配置client不需要释放 登录目标client SCC1

【大数据基础】大数据概述

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数…

【ROS2】☆ launch之Python

☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写…

Shell编程详解

文章目录 一、Linux系统结构二、Shell介绍1、Shell简介2、Shell种类3、Shell查询和切换 三、Shell基础语法1、注释2、本地变量3、环境变量3.1、查看环境变量3.2、临时设置环境变量3.3、永久设置环境变量 4、特殊变量5、控制语句5.1、shell中的中括号5.2、if语句5.3、for循环5.4…

Zemax 序列模式下的扩束器

扩束器结构原理 扩束器用于增加准直光束(例如激光束)的直径,同时保持其准直。它通常用于激光光学和其他需要修改光束大小或发散度的应用。 在典型的扩束器中,输入光束是准直激光器,或光束进入第一个光学元件。当光束开…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

探秘MetaGPT:革新软件开发的多智能体框架(22/30)

一、MetaGPT 引发的 AI 变革浪潮 近年来&#xff0c;人工智能大模型领域取得了令人瞩目的进展&#xff0c;GPT-3、GPT-4、PaLM 等模型展现出了惊人的自然语言处理能力&#xff0c;仿佛为 AI 世界打开了一扇通往无限可能的大门。它们能够生成流畅的文本、回答复杂的问题、进行创…

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配给某个进程/线程。 实际应用中用到的模型&#xff1a; 单 Reactor 单进程 单 Reactor 多线程 优点&#xff1a;能充分利用多核CPU性能。 缺点&#xff1a;存在多线程竞争共享资源…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…

【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解

一、Dify & DMXAPI 1、Dify DIFY&#xff08;Do It For You&#xff09;是一种自动化工具或服务&#xff0c;旨在帮助用户简化操作&#xff0c;减少繁琐的手动操作&#xff0c;提升工作效率。通过DIFY&#xff0c;用户能够快速完成任务、获取所需数据&#xff0c;并且可以…

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中&#xff0c;通过AI寻边技术自动识别布匹的边缘&#xff0c;将检测到的边缘信息输出&#xff0c;确保裁剪的准确性&#xff0c;减少浪费&#xff0c;并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉&#xff0c;且误差小…

http range 下载大文件分片

摘自&#xff1a;https://www.jianshu.com/p/32c16103715a 上传分片下载也能分 HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 检测服务器端是否支持范围请求 假…

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…

【巨实用】Git客户端基本操作

本文主要分享Git的一些基本常规操作&#xff0c;手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置&#xff08;第一次使用或者需求变更的时候&#xff09;&#xff0c;告诉git未来是谁在提交代码 git config --global user.na…