Java第二十一章总结

news2025/3/11 1:16:25
网络编程三要素

ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议

InetAddress类

表示Internet协议地址

        //返回InetAddress对象
        InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");

        //返回计算机名
        String hostName = byName.getHostName();

        //返回Ip地址
        String hostAddress = byName.getHostAddress();

端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败

协议
计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议
 用户数据报协议(User Datagram Protocol)
 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
 UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

TCP协议
 传输控制协议 (Transmission Control Protocol)

 TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

三次握手:
  第一次握手,客户端向服务器端发出连接请求,等待服务器确认

  第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

  第三次握手,客户端再次向服务器端发送确认信息,确认连接

UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket

构造方法

 相关方法

        //创建一个发送数据Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建一个包,用于存放要发送的数据
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
        //发送数据
        ds.send(dp);
        ds.close();
      

 

UDP接受数据

构造方法

方法名说明
DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包

相关方法

        //创建一个接收端的Socket对象
        DatagramSocket ds=new DatagramSocket(8888);
        
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);
        
        //接收数据
        ds.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ds.close();
 

UDP三种通讯方式

单播:两个主机之间的端对通信

组播:对一组特定的主机进行通信

广播:一个主机对整个局域网所有主机通信

组播代码实现:

//发送端
        //创建发送端的Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建数据包,
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
        //发送
        ds.send(dp);
        //释放资源
        ds.close();
        
//========================================================
//接收端

        //创建一个接收端的Socket对象
        MulticastSocket ms=new MulticastSocket(8888);
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);

        //把当前电脑绑定一个组播地址
        ms.joinGroup(InetAddress.getByName("224.0.1.1"));

        //接收数据
        ms.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ms.close();

TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类

Socket构造方法


相关方法方

        //创建一个客户端Socket对象
        Socket s=new Socket("127.0.0.1",8888);
        //获取输出流,输出数据
        OutputStream outputStream = s.getOutputStream();
        outputStream.write("hello".getBytes());
        //释放资源
        s.close();
 

TCP接收数据

构造方法

方法名说明
ServletSocket(int port)创建绑定到指定端口的服务器套接字

相关方法

方法名说明
Socket accept()监听要连接到此的套接字并接受它

        //创建服务器端ServerSocket对象
        ServerSocket ss=new ServerSocket(8888);
        //监听
        Socket accept = ss.accept();
        //创建一个输入流对象接收数据
        InputStream inputStream = accept.getInputStream();
        byte[] bytes=new byte[1024];
        int len=inputStream.read(bytes);
        String data =new String(bytes,0,len);
        System.out.println(data);
        accept.close();
        ss.close();
 

文件上传

从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地

 

//客户端

   //获取客户端Socket对象
        Socket s = new Socket("127.0.0.1", 8888);
        //从本地读取要上次的文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
        OutputStream os = s.getOutputStream();
        byte[] bys = new byte[1024];
        int i;
        while ((i = bis.read(bys)) != -1) {
            // os.write(i);
            os.write(bys, 0, i);
        }

        os.flush();

        //给服务器一个结束标记,标识已经传输完毕
        s.shutdownOutput();

        //获取服务器给回的信息
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        //释放资源
        bis.close();
        s.close();

//======================================

//服务器端

 //创建服务器ServerScoket对象
        ServerSocket ss = new ServerSocket(8888);
        //开始监听
        Socket s = ss.accept();
        //接受客户端数据
        InputStream is = s.getInputStream();
        //创建一个字符缓冲流保存接受的数据
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
        int len;
        byte[] bys = new byte[1024];
        while ((len = is.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        //告诉客户端已经接受完毕
        s.shutdownInput();

        //给客户端返回“上传成功信息”
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        //释放资源
        bos.close();
        s.close();
        ss.close();


 

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

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

相关文章

程序员的养生之道

程序员的养生之道 1 对程序员的初次印象2 我的养生之道2.1 规律作息:2.2 合理饮食:2.3 健康饮食:2. 4 增强锻炼:2. 5 心态平和:2. 6 生活习惯:2.7 定期体检:2.8 特殊注意:2.9 补充能…

Zookeeper系统性学习-应用场景以及单机、集群安装

Zookeeper 是什么? Zookeeper 为分布式应用提供高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 …

微表情检测(三)----基于光流特征的微表情检测

Micro-expression spotting based on optical flow features 基于光流特征的微表情检测 Abstract 本文提出了一种高精度和可解释性的自动微表情检测方法。首先,我们设计了基于鼻尖位置的图像对齐方法,以消除由头部晃动引起的全局位移。其次&#xff0…

C# Winform 日志系统

目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …

lv12 系统移植导学 1

1 导学 Kernel学习主要包括三块内容,ARM(汇编、协议)、系统移植、驱动移植 lv12主要时安装系统linux linux主要帮我们实现了5大功能 1 进程、线程管理 2 内存管理 3 网络协议栈管理 4 文件系统管理 5 设备管理 2 移植的目的 不同架构…

ptmalloc:从内存虚拟化说起

前言 本文并不局限于ptmalloc的原理,而是从linux的内存虚拟化和系统调用原理出发,结合各种语言实现,讲明内存分配方面的trade off,力图事无巨细,追根究底。本文内容包括但不限于:NIO原理、0拷贝原理、内存…

AirServer 5.63中文破解2024最新图文安装激活教程含许可证

AirServer是一款便捷式投屏软件,它的主要功能在于实时地将移动设备上的图像画面内容投放到电脑设备上,让电脑成为iPad、iPhone等iOS系统设备的大屏显示器。 在设备之间建立局域网内的信号发送与接收通道,确保数据可以稳定安全地进行传输。下面…

大模型对数据分布变化的鲁棒性研究综述

摘要: 标准机器学习的一个主要限制是它产生的模型对分布变化不鲁棒,其中训练分布与测试分布不匹配(对于下游任务)。现有的工作表明,调整在广泛的未标记数据上训练的基础模型可以提高适应模型在各种变化中的鲁棒性。这为…

【Java 基础】28 字符编码

文章目录 1.字符集2.编码方式1)ASCII2)UTF-8 编码3)UTF-16 编码4)ISO-8859-1 编码 3.使用样例Charset 类String 类 4.注意事项结语 字符编码(Character Encoding)是一种将字符映射为二进制数据的规则或算法…

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础,无论微服务设计上层如何发展,讨论服务治理都绕不开远程服务调用,那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

macos下安装科研绘图软件Origin

科研人必备软件Origin,主要是考虑到很多期刊都要求绘制origin可编辑的图,所以有些时候必须用这个软件,但是这个软件macos并不支持,所以必须考虑其他的方案,我没有安装虚拟机,而是使用crossover 安装crosso…

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…

Java中的IO流②——字符集、字符流、缓冲流

主要的编码规范&#xff1a; GBK编码 Windows自带 Unicode编码 为什么会有乱码&#xff1f; 原因一 原因二 编码和解码的代码实现 字符流 FileReader read()细节&#xff1a; 一&#xff1a;默认也是一个字节一个字节的读取&#xff0c;如果遇到中文就会一次读取多个 二&a…

Terminator的layout设置(一个新的一键启动思路)

首先你得有terminator&#xff1a; sudo apt install terminator然后就能使用了&#xff0c;我一般喜欢修改它原本的水平和垂直分割&#xff1a;用ctrlshifta和ctrlshifts 把屏幕先分成多块&#xff1a; 比如是这样的&#xff0c;接下来 右键->点击Preference 弹框中上方标…

pdi-ce-9.4.0.0-343.zip和pentaho-server-ce-9.4.0.0-343.zip区别及简单使用

目录 &#x1f351;一、概述&#x1f34a;1.1、pdi-ce-9.4.0.0-343.zip&#x1f34a;1.2、pentaho-server-ce-9.4.0.0-343.zip &#x1f351;二、简单使用&#x1f34a;2.1、pdi-ce-9.4.0.0-343&#x1f34a;2.2、pentaho-server-ce-9.4.0.0-343&#x1f34a;2.3、联合使用 &am…

MongoDB的连接数据库,创建、删除数据库,创建、删除集合命令

本文主要介绍MongoDB的连接数据库&#xff0c;创建、删除数据库&#xff0c;创建、删除集合命令。 目录 MongoDB连接数据库连接到本地 MongoDB 实例连接到远程 MongoDB 实例 MongoDB创建和删除数据库MongoDB创建和删除集合创建集合删除集合 MongoDB连接数据库 连接 MongoDB 数…

报表生成器Stimulsoft用户手册:预览中具有动态数据排序的报告

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

[香橙派]Orange pi zero 3命令行配网方法——建立ssh连接——Ubuntu配置WIFI自动连接

一、前言 前面我们给Orange Pi安装了Ubuntu系统&#xff0c;并通过MobaXterm进行了串口连接&#xff0c;但其实并不方便&#xff0c;在日常开发中&#xff0c;我们希望能够使用更方便的ssh连接来进行操作&#xff0c;因此配置网络是必要的。 本章介绍的方法无需网线、HDMI线等&…

我的NPI项目之Android 安全系列 -- Android Strongbox 初识

从Android9(Pie)开始,Google强烈建议支持Strongbox. 具体描述如下: 一直到目前的Android14. 对应的内容也一并贴出来: 说人话就是Android开始通过独立于主SoC的单元进行密钥存储了。 通常&#xff0c;这样的单元就是我们通常称作的Secure Element&#xff08;SE&#xff09;&am…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组&#xff0c;加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的&#xff1a; 需要将每个人的成绩显示在一行上&#xff0c;需要的结果如下&#xff0c;但是我的情况是课程有非常…