4月18号总结

news2024/9/20 22:34:02

java学习

网络编程

1.网络分层

网络分层是将网络通信划分为不同的逻辑层次,每一层负责特定的功能,从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI(开放系统互联)模型和TCP/IP模型。

59ac1acfcce24cea8005dc21cd920447.png

 

特点和作用:

  • 分层模型使得网络协议更易于设计、实现和维护,每一层都有明确定义的功能和接口。
  • 分层模型提供了标准化的接口和协议,不同厂商和组织之间可以基于共同的标准进行通信和互操作。
  • 每一层的功能清晰划分,有助于故障排除和性能优化。

总的来说,网络分层模型是一种组织网络通信的方式,将复杂的通信过程分解为多个层次,使得网络设计和管理更加简单和可靠。

2.网络编程三要素

d59726768fad455ea58153c609df7e6e.png

2.1 IP地址

IP地址相当于每台计算机的标识符,也就是“名字”,如果想要实现计算机的网络通信,那么IP地址就是帮助你找到你想要通信的计算机的方式。

IP地址分类为IP4,和IP6。

IP4又四个字节组成,32位,大约可以表示42亿台计算机,但是随着电子产品的增多,IP4分配的地址明显是不够的,那么我们就需要一种能分配更多地址的方式,那就是IP6。

IP6有16字节,128位,号称可以为地球的每一粒沙子命名。

71dfd3c411b64d1f84c10192734d3cc5.png

如果想要知道自己电脑的IP地址,可以Win+R打开黑窗口,输入ipconfig就可以查看自己电脑的IP4和IP6地址(一些新的设备没有IP4地址)。

2.2 端口

如果说IP地址是计算机的标识,那么端口号就是应用程序的标识,没有端口号,两台计算机之间也不能实现网络通信。

端口分类:

公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。(我们后面开发的程序可以使用这个范围的端口号)
动态/私有端口:49152~65535。
端口号与IP地址的组合得出一个网络套接字:Socket。

2.3 协议

网络通信协议是一组规则和约定,用于在计算机网络中进行通信和数据交换。这些协议定义了数据如何在网络中传输、路由和处理。常见的网络通信协议包括:

  1. TCP(传输控制协议):提供可靠的、面向连接的通信服务,确保数据的顺序传输和不丢失。常用于需要可靠数据传输的应用,如网页浏览、文件传输等。

  2. UDP(用户数据报协议):提供无连接的通信服务,数据传输不可靠,不保证数据的顺序和完整性。常用于实时应用,如音视频传输、在线游戏等。

  3. IP(互联网协议):定义了计算机在网络上的唯一标识(IP地址),以及数据包的格式和路由规则。IPv4和IPv6是目前广泛使用的两个版本。

  4. HTTP(超文本传输协议):用于在客户端和服务器之间传输超文本文档,是万维网的核心协议。通过HTTP,用户可以访问网页、发送和接收电子邮件等。

  5. HTTPS(超文本传输安全协议):是HTTP的安全版本,通过SSL/TLS加密协议保护数据传输的安全性和完整性。

  6. FTP(文件传输协议):用于在网络上传输文件,支持文件上传、下载和管理。

  7. SMTP(简单邮件传输协议):用于在网络上传输电子邮件,定义了电子邮件的格式和传输规则。

  8. POP3(邮局协议第3版)IMAP(互联网消息访问协议):用于接收和管理电子邮件的协议,POP3将邮件下载到本地客户端,而IMAP在服务器上管理邮件,客户端只是远程访问邮件。

  9. DNS(域名系统):将域名映射到IP地址的分布式数据库系统,用于解析域名和进行网络寻址。

  10. ARP(地址解析协议):将IP地址解析为物理地址(MAC地址)的协议,用于在局域网中进行通信。

这些网络通信协议共同构成了计算机网络的基础,实现了各种应用和服务之间的通信和交互。

这里为我们着重讲UDP通信TCP通信

3.UDP

352c8b518097442fa239945d544203a1.png

从上面图片我们可以看到,使用UDP通信时,不需要与向接收的一方提前建立联系,直接发送信息,信息是否传送到了,不能得知,如果接收信息的一方没在线,发送信息的一方仍然可以发送信息,所以信息是否安全发送不能保证,但是没有了事先的建立联系,通信效率也提高了不少。

实现UDP通信,主要使用到下面方法。

d98598fd3e1d4db0b257552250987107.png

b3e115bb734e4248a8e3c60c0b29964b.png

下面我们用代码实现一下。

用户端:

public class Client {
    public static void main(String[] args) {
        //1、创建客户端,发消息的人
        try {
            DatagramSocket socket =new DatagramSocket();
            //2、创建包含信息的包
            Scanner scan=new Scanner(System.in);

            while (true) {

                String msg=scan.nextLine();//输入字符串
                byte[] bytes=msg.getBytes();//转换成字节数组
                if("exit".equals(msg))//退出判断
                {
                    socket.close();
                    break;
                }
                //将信息包装
                DatagramPacket packet=new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),6666);
                //发送信息包
                socket.send(packet);
            }
        } catch (Exception e) {//捕获异常
            throw new RuntimeException(e);
        }
    }
}

服务端:

public class Server {
    public static void main(String[] args) {

        try {
            //1。创建服务端对象
            DatagramSocket socket =new DatagramSocket(6666);//指定端口号

            //2,创建一个数据包对象,用于接受数据
            byte[] buffer =new byte[1024*64];
            DatagramPacket packet =new DatagramPacket(buffer,buffer.length);
            while (true) {
                //接收信息包
                socket.receive(packet);
                int len=packet.getLength();
                String s1=new String(buffer,0,len);
                System.out.println(s1);//打印信息
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

8f41aad46f3049c4978c4d70c426b1d3.png

 

4.TCP

9e8ce0b6312846088830cb022362e99d.png

发送信息:
2c57cb7db9e74afeb0e3e18901a2e68a.png

 

接收信息:

8ec6f5878bfa4938a34072acac348320.png

 

下面我们用多线程实现一个服务端连接多个用户端,并且可以实现多发多收。

服务端:

 

package com.lenrn.tcp;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    public static void main(String[] args) throws Exception {
        //1.实例化一个serversocket对象
        ServerSocket serverSocket=new ServerSocket(6886);
        //2.等待客户端连接,程序暂停,等待客户端的连接请求
        System.out.println("服务端启动");
        while (true) {
            //多次与新用户连接
            Socket socket= serverSocket.accept();

            System.out.println("已经与"+socket.getRemoteSocketAddress()+"建立连接");
            //子线程
            new ServerReadThread(socket).start();
        }

    }
}

class ServerReadThread extends Thread{
    private Socket socket;
    public ServerReadThread(Socket socket)
    {
        this.socket=socket;
    }
    @Override
    public void run() {
        try {

            //3.从socket对象中得到一个字节输入流、
            InputStream is = socket.getInputStream();
            //4.将低级的字节输入流包装成数据输入流
            DataInputStream dis=new DataInputStream(is);
            while (true)
            {
                String rs= dis.readUTF();
                System.out.println(rs);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress()+"下线了");
        }
    }
}

 

用户端:

用户端多开需要勾选选项。

fc5d8a02f4694efeb8f62db5584ea958.png

2f66c49e6e4f4296a241c06795e57255.png

勾选应用即可。

package com.lenrn.tcp;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {

        //1.创建一个Socket对象,同时请求连接服务端
        Socket socket=new Socket("127.0.0.1",6886);

        //2.从socket管道中得到一个字节输出流

        OutputStream os=socket.getOutputStream();
        //3.将低级的字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);
        //4.写数据出去
        Scanner scan=new Scanner(System.in);
        while (true) {
            String msg = socket.getRemoteSocketAddress().toString();
            msg+=": ";
            String k=scan.nextLine();
            msg+=k;
            if("exit".equals(k))
            {
                System.out.println("退出成功");
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
        }
    }
}

 

ff2f37cb95df47c78d4b519fa2e724b8.png

 

 

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

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

相关文章

(C++) 树状数组

目录 一、介绍 二、一维树状数组 2.1 区间长度 2.2 前驱和后继 2.3 查询前缀和 2.4 点更新 三、一维数组的实现 3.1 区间长度函数 3.2 前缀和 3.3 插入/更新 3.4 封装成类 一、介绍 树状数组(Binary Indexed Tree,BIT),又称为 …

火绒安全概述

页面简介: 火绒安全是一款集多种安全功能于一体的国产软件,旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览: 杀毒防护 实时监控:详细介绍火绒安全如何实时检测系统中的文件和程序…

Pyside6:Spacer的使用,布局中控件顶格添加

在普通的布局,如水平或纵向布局中,我们的控件都会保持中间状态,如下: 但有许多情况下 ,我们需要将控件布局为如下界面: 在前端开发时,我们很容易通过flex来进行布局,修正它的居中或者…

Github首页美化(updating)

Github首页美化 https://github.com/QInzhengk一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 https://github.com/QInzhengk 一、新建仓库 对Github首页进行美化,需要新建一个仓库名和自己 Github 用户名相同的仓库…

【数据库】三、数据库SQL语言命令(基础从入门到入土)

【全文两万多字,涵盖大部分常见情况,建议点赞收藏】 目录 文章目录 目录安装SQL语言1.使用2.DATABASE查看所有库新建数据库修改数据库删除数据库连接数据库 3.TABLE创建表查看库所有表删除表查看表信息重命名表修改表字段(列)表中…

Java---ideaIU-2023.1专业版使用以及安装方法

介绍 JetBrains 是一家专注于创建智能开发工具的前沿软件公司,包括:行业中领头的 Java IDE – IntelliJ IDEA,以及 Kotlin 编程语言。旗下常用的软件有IntelliJ IDEA、PhpStorm、RubyMine、Rider、WebStorm、goland、CLion、Pycharm,本安装包集成以上8款软件&#…

最大层内元素和

题目链接 最大层内元素和 题目描述 注意点 返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个树中的节点数在 [1, 10000]范围内-10^5 < Node.val < 10^5 解答思路 广度优先遍历树&#xff0c;使用队列存…

windows系统CUDA的详细安装教程

CUDA系列 文章目录 CUDA系列前言一、CUDA简介二、安装配置视频教程三、CUDA的下载及安装3.1 环境检查3.2 CUDA 安装包下载3.3 安装CUDA&#xff08;略&#xff09;3.4 验证CUDA是否安装成功 四、cuDNN的下载及安装4.1 cuDNN下载4.2 cuDNN配置 五、配置环境变量六、下载并配置zl…

Day4 商品管理

Day4 商品管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 编写品牌服务 …

LangChain入门指南:构建高可复用、可扩展的LLM应用程序 PDF书籍分享

今天又来给大家推荐一本大模型方面的书籍<Langchain入门指南>这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章&#xff0c;从LLM基础知识开始&#xff0c;通过LangChain这个开源框架为读者解读整个LLM应用开发流程。 下载当前…

轻松记录收支明细,详细记录每一笔收支,通过借款日期快速查找借款信息

财务管理对于个人和企业来说都至关重要。一份清晰、详尽的收支明细记录&#xff0c;不仅能帮助我们了解资金流向&#xff0c;还能在需要时提供有力的证据。因此&#xff0c;高效记录收支明细并轻松掌握财务状况成为了每个人的必备技能 第一步进入晨曦记账本主页面&#xff0c;…

ros2_control【B站WMGIII教学学习记录】1

资源 https://www.bilibili.com/video/BV1ku411G7UR? 学习过程中存在bug&#xff0c;记录一下 1 Q:"package ‘joint_state_publisher_gui’ not found, searching: [/home A: sudo apt install ros-humble-joint-state-publisher2 https://fishros.org.cn/forum/to…

抢先看!LEADTOOLS V23 全新版发布,预览全新产品线布局!

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年&#xff0c;其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中&#xff0c;LEAD以其在全世界主要国家中占有的市场领导地位…

SpringCloud引入SpringBoot Admin

Spring Boot Admin可以监控和管理Spring Boot&#xff0c;能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供警报功能。 1. 创建SpringBoot工程 2. 引入相关依赖 <dependency><groupId>com.alib…

基于ontape的备份与恢复实验

通过本文的备份恢复实验&#xff0c;我们可以深入了解ontape的使用方法和原理&#xff0c;包括如何进行完整备份、增量备份以及如何利用备份文件进行数据恢复。 1. 配置onconfig参数 通过修改onconfig参数文件&#xff0c;或使用onmode -wf命令&#xff0c;设置备份默认使用的…

电商巨头亚马逊公布新算法!或将颠覆跨境选品风向…

亚马逊每一次算法的变动&#xff0c;都会牵扯到无数卖家的利益。电商巨头亚马逊发布了一则报告&#xff0c;正式公布了一个名为“COSMO”的新算法。该算法全称为“亚马逊大型电商常识知识生成与服务系统”&#xff0c;顾名思义&#xff0c;就是利用大量语言模型训练机器&#x…

DSP系统的设计过程与选型

DSP的设计步骤分几个阶段&#xff0c;应用系统的设计过程如图所示。 技术指标的确定 器件的选型原则 其他因素的考虑

谈谈mysql中的各个关键字

1.为什么学习mysql mysql是当今最主流且开放源码的关系型数据库&#xff0c;开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;许多中小型网站为了降低…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…