JAVA网络编程(一)

news2024/12/30 1:34:00

一、什么是网络编程

定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
应用场景:即时通信,网游,邮件等
不管什么场景,都是计算机与计算机之间通过网络在进行数据传输
java提供一个java.net包,可以帮助我们开发网络应用程序。

二、常见的网络应用程序架构

在这里插入图片描述
CS架构是指在远端有一个服务器Server,用户需要在本地下载一个客户端Client。
BS架构是指远端有一个服务器,用户通过浏览器进行访问。
在这里插入图片描述

BS架构的优缺点

优点:
①不需要开发客户端,只需要页面和服务端
②用户不需要下载应用,只需要在浏览器访问
缺点:
①如果应用中的资源体积过大,那么用户体验将受到影响,比如图片过大,浏览器就要加载一会儿才能显示。
在这里插入图片描述

CS架构的优缺点

优点:
①画面可以做的非常精美,不用担心传输慢,因为需要提前下载资源包到本地
缺点:
②需要开发客户端和服务端,工作量加大
③用户需要下载安装和更新

三、网络编程三要素

IP、端口号、协议
在这里插入图片描述

IP

全称:Internet Protocol,是互联网协议地址,也称ip地址,是分配给上网设备的数字标签。
常见的IP分类有IPv4和IPv6两种。

IPv4

在这里插入图片描述

IPv6

在这里插入图片描述

总结:

在这里插入图片描述

在这里插入图片描述

IPv4是如何节约分配的?

在这里插入图片描述
以网吧举例,网吧里面的电脑很多,不可能为每一台电脑设置一个公网ip,所以就出现了下面的方案:
所有电脑共用一个公网ip,每台电脑拥有一个局域网ip
在这里插入图片描述

特殊的Ip地址

127.0.0.1,也可以是localhost:是回送地址,也称本地回环地址,也称本机ip,永远只会寻找当前所在本机。
提问:
如果192.168.1.100是我电脑的ip地址,那么这个ip和127.0.0.1是一样的吗?
答案:不是的,192.168.1.100是局域网给你的电脑分配的ip地址,而127.0.0.1是只代表本机的地址
举例
使用电脑向192.168.1.100发送消息,数据会先经过路由器,然后通过路由器发送数据给我的电脑。
并且如果我的电脑换了一个局域网环境,比如换了一个路由器,那么我的电脑的ip地址可能会发生改变。
在这里插入图片描述
如果使用127.0.0.1,我的电脑就不会向路由器发送信息,信息在通过网卡的时候就会发现这条数据是发送给回环地址的,直接发送给我的电脑。
在这里插入图片描述

常见的cmd命令

在这里插入图片描述

总结

在这里插入图片描述

InetAddress对象

InetAddress类没有公有的构造方法,只能通过getByName(String name)方法获取InetAddress对象。
InetAddress对象表示一个IP,一个IP对应着一台网络中的设备,所以InetAddress对象也可以表示一台设备。
当获取到这台设备的InetAddress对象时,就可以给这个对象发送消息了

/**
 * @author Watching
 * * @date 2023/5/26
 * * Describe:
 * static InetAddress getByName(String host) 确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址
 * String getHostName() 获取此ip地址的主机名
 * String getHostAddress() 返回文本显示中的ip地址字符串
 */
public class MyInetAddressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
        //InetAddress 表示ip的对象,而ip有表示一台联网设备,所以这也能表示一台设备对象
        InetAddress address = InetAddress.getByName("DESKTOP-DHVQ061");
        System.out.println(address);

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress);

        String hostName = address.getHostName();
        System.out.println(hostName);
    }
}

在这里插入图片描述

端口号

端口号时应用程序在一台设备中的唯一标识
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口用于一些知名的网络服务或应用,所以我们自己的程序应该使用1024以上的端口号
一个端口号只能被一个应用程序使用

协议

计算机网络中,连接和通信的规则被称为网络通信协议。
在这里插入图片描述

OSI参考模型
数据从应用层一直传输到物理层,转为可网络传递的二进制形式,传递另外一台电脑上,再由下到上到应用层,转为原始数据。
在这里插入图片描述
TCP/IP协议
TCP/IP模型将应用层、表示层、会话层合为一层,数据链路层、物理层合为一层。
TCP/IP模型减少了流程复杂度,减少了资源消耗
在这里插入图片描述
我们重点学习传输层的TCP和UDP协议。

UDP协议

UDP协议的特点就是速度快,面向无连接, 不管是否连接成功,都会发送数据,应用场景比如视频聊天,电话等,就算出现了连接失败,也只是会出现卡顿的情况
在这里插入图片描述

测试UDP传输数据

步骤:
1.创建DatagramSocket对象,建立连接
2.打包数据,需要指定接收端口
3.发送数据
4.关闭连接

/**
 * @author Watching
 * * @date 2023/5/26
 * * Describe:
 */
public class SendMessageDemo1 {
    public static void main(String[] args) throws IOException {
        //发送数据
        //1.创建DatagramSocket对象
        //细节:
        //绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket datagramSocket = new DatagramSocket();
        //2.打包数据
        String str = "你好威啊";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        //3.发送数据
        datagramSocket.send(dp);
        //4.关闭连接
        datagramSocket.close();
    }
}

在打包数据的时候,DatagramPacket里面有很多构造器,可以根据需要选择不同的构造器。

在这里插入图片描述

测试UDP接收数据

步骤:
1.创建DatagramSocket对象建立连接,端口要与发送者的目的端口一致
2.创建DatagramPacket对象接收数据
3.通过DatagramPacket对象获取数据数据长度发送者IP发送者端口号等信息
4.断开连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建socket连接,端口要与发送消息的要相同
        DatagramSocket ds = new DatagramSocket(10086);


        //2.接受数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //该方法是阻塞式的方法,会一直阻塞直到接受到消息
        ds.receive(dp);

        //3.解析数据包
        byte[] data = dp.getData();
        int length = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();
        System.out.println(new String(data,0, length));
        System.out.println("数据是从 [" + address + "]" + "发送来的");
        System.out.println("端口是 [" + port + "]");

    }
}

接收数据时使用的DatagramSocket对象的 receive(DatagramPacket dp) 方法,这个方法是阻塞式的,直到接收到传来的消息才会停止阻塞。

UDP的三种通信方式

单播
单对单传输
在这里插入图片描述
组播
一组设备接收消息
在这里插入图片描述
广播
所有设备都能接收消息
在这里插入图片描述

UDP三种通信方式的代码实现

在这里插入图片描述

单播

前面我们编写的代码就是单播

组播

发送端:
步骤:
①创建组播连接,使用MultiCastSocket类
②创建DatagramPacket对象打包数据,需要指定接收端口
③发送消息
④关闭连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:测试组播发送代码
 *
 */
public class SendMessageDemo2 {
    public static void main(String[] args) throws IOException {
        //1.创建组播连接
        MulticastSocket mcs = new MulticastSocket();
        //2.创建数据包打包数据
        String str = "你好";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);
        //3.发送消息
        mcs.send(dp);
        //4.关闭连接
        mcs.close();
    }
}

接收端:
步骤:
①创建组播连接,使用MultiCastSocket
②将当前连接加入组播地址
③创建DatagramPacket对象接收数据
④解析数据
⑤关闭连接

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:接收组播消息
 */
public class ReceiveMessageDemo2 {
    public static void main(String[] args) throws IOException {
        //1.建立mcs连接,并且填写发送端的端口
        MulticastSocket mcs = new MulticastSocket(10086);
        //2.将当前本机连接加入组播
        InetAddress address = InetAddress.getByName("224.0.0.1");
        mcs.joinGroup(address);
        //3.创建DatagramPacket接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        mcs.receive(dp);
        //5.解析数据
        int port = dp.getPort();
        InetAddress ip = dp.getAddress();
        int length = dp.getLength();
        byte[] data = dp.getData();

        System.out.println(new String(data, 0, length));
        System.out.println("数据来自 [" + ip + "] 端口 [" + port + "]");
        //5.关闭连接
        mcs.close();
    }
}

可以多创建两个类,并运行他们,当发送端的代码执行后,每个添加进组播的连接都能接收到数据

广播

将单播的代码创建数据包DatagramPacket时,将发送的地址改为255.255.255.255就成了广播,局域网中的所有设备都能受到消息。

TCP协议

TCP协议的特点就是面向连接,要在确保连接成功之后才会传输数据,应用场景比如下载软件,发送邮件等。下载软件丢失了数据,可能会导致软件安装不成功,发送邮件丢失数据可能会导致邮件内容错乱。
在这里插入图片描述

TCP通信程序

在这里插入图片描述
客户端代码编写步骤
①创建客户端Socket对象与指定服务端连接
Socket(String host,int port);
②获取输出流,写数据
OutputStream getOutputStream
③释放资源

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:tcp协议客户端
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //tcp协议发送数据
        //1.创建socket连接对象
        //细节:创建对象的同时会连接服务端,如果连接不上,会直接报错 Exception in thread "main" java.net.ConnectException: Connection refused: connect
        Socket socket =  new Socket("127.0.0.1",10086);//这行代码就是在创建连接(三次握手
        //2.从连接通道中获取输出流,将数据输出给服务端
        OutputStream outputStream = socket.getOutputStream();
        String str = "你好!";
        outputStream.write(str.getBytes());
        //3.关闭资源
        outputStream.close();
        socket.close();//断开连接,四次挥手协议,保证连接通道中的数据已经处理完成了

    }
}

服务端代码编写步骤
①创建服务器端的socket对象(ServerSocket)
ServerSocker(int port)
②监听客户端连接,返回Socket对象
Socket accept()
③获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
④释放资源

/**
 * @author Watching
 * * @date 2023/5/27
 * * Describe:tcp协议服务端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //服务端 接收数据
        //1.创建服务端连接
        ServerSocket ss = new ServerSocket(10086);//需要绑定一个端口号,以供客户端访问
        //2.监听客户端的连接
        Socket accept = ss.accept();//accept方法也是一个阻塞式的方法
        //3.从连接通道中获取输入流
        InputStream is = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            System.out.println(new String(bytes,0,len));
        }
        //4.释放资源
        is.close();
        ss.close();

    }
}

3次握手,4次挥手
3次握手建立连接:
在这里插入图片描述
4次挥手断开连接:
在这里插入图片描述

总结

在这里插入图片描述

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

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

相关文章

软件测试必会:cookie、session和token的区别

今天就来说说session、cookie、token这三者之间的关系!最近这仨玩意搞得头有点大🤣 01、为什么会有它们三个 我们都知道 HTTP 协议是无状态的,所谓的无状态就是客户端每次想要与服务端通信,都必须重新与服务端链接,意…

穿针引线之 AsyncLocalStorage

在 Node.js 中,如何更优雅地获取请求上下文一直是一个问题,看一下下面的例子。 背景 const http require(http); function handler1(req, res) {console.log(req.url); }function handler2(req, res) {console.log(req.url); }http.createServer((req…

【react全家桶】react-Hook (下)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 15【react-Hook &#xff08;下&#x…

进程控制(Linux)

进程控制 fork 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创建失败返回-1。 …

Spring - BeanFactory与ApplicationContext介绍

文章目录 Spring Bean一、BeanFactory 快速入门1.1 BeanFactory 开发步骤1.2 DI依赖注入 二、ApplicationContext快速入门2.1 入门2.2 BeanFactory 与 ApplicationContext关系2.3 BeanFactory 继承体系2.4 ApplicationContext 继承体系 Spring Bean 之前也了解过Spring Bean&a…

高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression)

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression) 研究内容 高斯过程回归(Gaussian Process Regression,GPR)是一种基于概率模型的非参数回归方法,可以用于

mybatisplus数据权限插件学习初探 动态表名更换插件

文章目录 学习链接 mybatisplus数据权限插件学习初探前言案例建表用户表订单表 环境准备UserUserMapperUserMapper.xmlOrdersOrdersMapperOrdersMapper.xml 配置UserTypeEnumUserContextHolderCustomizeDataPermissionHandlerMybatisPlusConfig 测试测试类bossdeptManagerclerk…

Zinx框架学习 - 消息封装

Zinx - V0.5 消息封装 之前我们使用Request来保存服务器的数据&#xff0c;很显然使用[]byte来接收数据&#xff0c;没有长度也没有消息类型&#xff0c;接下来就要针对这个消息进行封装 创建消息类型 定义一个基本的message包&#xff0c;会包含消息ID、数据、数据长度三个…

路径规划算法:基于探路者优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

涉及float和double

文章目录 涉及float和double的问题&#xff1a;它们的存储方式&#xff1a;有效位&#xff1f; 链式结构 涉及float和double的问题&#xff1a; 它们的存储方式&#xff1a; 它们会分成小数部分和指数部分分别存储。小数部分的有效位数越多&#xff0c;精度就越高&#xff0c;…

NLP超详细新手快速入门上手篇(1)常用函数

前言 自然语言处理(NLP)是机器学习的应用之一&#xff0c;用于分析、理解和生成自然语言&#xff0c;以便人类与计算机&#xff0c;人类与人类更好的交流。自然语言处理按照任务类型可以分为分类、匹配、翻译、结构化预测、与序贯决策过程这五类。 本篇参考自TensorFlow官方文…

MyBatis 查询数据库

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 MyBatis 是什么&#xff1f;第⼀个MyBatis查询创建数据库和表添加MyBatis框架支持设置 MyBatis 配置信息添加业务代码 查询操…

【VBA】实现批量生成二维码

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

Nginx - ​一个高性能、灵活可靠的开源Web服务器

Nginx是什么&#xff1f; Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1…

idea使用native-image打包springboot项目

native-image简介 native-image 是一个用于将 Java 程序编译为本地可执行文件的工具。它是 GraalVM 的一部分&#xff0c;GraalVM 是一个高性能的通用虚拟机&#xff0c;支持多种语言。 使用步骤 下载GraalVM 安装 GraalVM&#xff1a;首先&#xff0c;你需要安装 GraalVM。…

20230603-周六随笔

周六闲来无事&#xff0c;给新电脑装下开发环境&#xff0c;记录一下遇到的问题 git下载代码报错 报错1&#xff1a;schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)解决方法&#xff1a;执行git config --system http.sslbackend openssl命令 报错2&#xff1a;SSL certifica…

【Java 8 新特性】获取对象列表中的某个属性组成的列表

文章目录 获取对象列表中的某个属性组成的列表1、用法示例2、详细案例 附录&#xff1a;Java 8 Stream 基本用法1、map2、filter3、forEach4、limit5、sorted6、并行&#xff08;parallel&#xff09;程序7、Collectors8、统计 获取对象列表中的某个属性组成的列表 1、用法示例…

高完整性系统工程(十一):Fault Tolerant Design

目录 1. INTRODUCTION TO FAULT TOLERANCE 1.2 Definitions 1.3 Two Kinds of Faults 1.4 Hardware vs Software Faults 1.4.1 Failure Curve for Hardware 1.4.2 Hardware and Software Failures 1.5 Causes of Failures 1.6 3 Ways to Class Failures 1.6.1 Tempora…

【LLM】大模型值得探索的十个研究方向

note 基础理论&#xff1a;大模型的基础理论是什么&#xff1f; 网络架构&#xff1a;Transformer是终极框架吗&#xff1f; 高效计算&#xff1a;如何使大模型更加高效&#xff1f; 高效适配&#xff1a;大模型如何适配到下游任务&#xff1f; 可控生成&#xff1a;如何实…

ChatGPT有关的模块知多少?

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 ChatGPT有关的模块知多少&#xff1f; &#x1f9ca;摘要&#x1f9ca;ChatGPT 开发库清单 &#x1f9ca;摘要 本文介绍了基于OpenAI ChatGPT 的API 开发的python 模块库。【原创&am…