网络通信(学习笔记)

news2024/9/30 6:42:17

InputStreamReader 是 Java 中的一个类,它可以将字节输入流转换为字符输入流。它可以读取字节输入流,并使用指定的字符集将字节解码为字符。

InputStreamReader继承了Reader类

Scanner scanner = new Scanner(System.in);//这是一个控制台输入的一个类,但是用的不多
String s = scanner.next();//读取一个单词,遇到空格就会停止
scanner.nextInt();//能够获取指定类型的数据
String s2 = scanner.nextLine();//读取一行,读取的效率是比较高的。

System.in的返回值是InputStream类型的数据。

其缺点是只能读取字符 !

InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String data = inputStreamReader.readLine();

上面这段代码和Scanner的nextLine()有异曲同工之妙!

Java开发语言中,输入输出流是非常重要的一部分,可以用于与文件、网络等各种资源进行交互。其中BufferedReader类是Java的输入流类之一,主要用于从字符输入流中读取文本,并将文本缓存到缓冲区中,从而提高读取文本的效率。BufferedReader继承了Reader类

BufferedReader是Java I/O中的一个类,它是一个带缓冲区的字符输入流,用于从字符输入流中读取字符。它提供了一种逐行读取文本文件的方法,可以轻松地读取大量文本数据,并且可以通过使用缓冲区来提高读取效率。它的主要作用是读取文本文件中的字符数据,可以读取文件中的每一行数据,是Java I/O中常用的数据读取类之一。BufferedReader类只能读取字符类型的数据,如果需要读取其他类型的数据需要进行类型转换。

优点:

  1. 数据缓存:通过BufferedReader类的缓存机制,可以在读取文本数据时,提高读取效率。
  2. 读取方式:BufferedReader类提供以行为单位读取数据的方法,可以方便地逐行解析文本数据。

缺点:

  • 由于BufferedReader是基于字符流的,对于读取二进制文件并不适用,不适合处理字节流。
  • 缓冲区的大小是固定的,如果输入流的内容超过了缓冲区大小,会导致缓冲区溢出。
  • 当BufferedReader类读取数据时,如果发生异常或读取过程中程序意外终止,可能会导致数据丢失

在java网络编程,shutdownOutput,shutdownInput可以表示和控制台说一次标记结束,表示input或者output结束。但是用这种方式会导致此套接字被禁用,只能执行一次。

需要自己close的东西,一般都是用了虚拟机之外的资源,例如端口,显存,文件等,虚拟机无法通过垃圾回收释放这些资源,只能你显式调用close方法来释放。

你读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用。

ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层,将类写入到文件等其他outputStream。它是对字节进行操作,属于内存操作流

ServerSocket serverSocket = new ServerSocket(9999);

Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer)) != -1){
    baos.write(buffer,0,len);
    System.out.println(new String(buffer,0,len));
}
System.out.println(baos.toString());

baos.close();
is.close();
socket.close();

扩容方式:

ByteArrayOutputStream是byte类型的数组进行自动扩容的。当写入长度大于数组原有长度时,就会自动调用grow()方法, buf数组是动态增长的 先扩容为2倍,如果size还是不够 就让数组f的sieze等于minCapacity

 

Tcp的Server端:(Tomcat也是一个服务端,服务器一般使用的都是别人的)

ServerSocket serverSocket = new ServerSocket(9991);

Socket socket = serverSocket.accept();

InputStream inputStream = socket.getInputStream();

int len;

byte[] bytes = new byte[1024];

while((len = inputStream.read(bytes)) != -1) {

System.out.println(new String(bytes,0,len));

}

inputStream.close();

socket.close();

Tcp的Client端:

Socket socket = new Socket("127.0.0.1",9991);

OutputStream outputStream = socket.getOutputStream();//FileOutputStream("文件名");能将文件发送给对方

outputStream.write("Hello World".getBytes());

outputStream.close();

socket.close();

UDP不需要建立连接:

是需要使用InetAddress的

DatagramSocket也是比较陌生的

DatagramPackage是比较陌生的!

Udp的server端:

DatagramSocket socket = new DatagramSocket(8088);

byte[] bytes = new byte[1024];

DatagramPackage package = new DatagramPackage(bytes,0,bytes.length);

socket.receive(package);

sout(new String(package.getData(),0,package.getLength()));

socket.close();

Udp的Client端:

DatagramSocket socket = new DatagramSocket(2999);

InetAddress inetAddress = InetAddress.getLocalhost();

DatagramPackage package = new DatagramPackage("Hello World".getBytes(),0,"Hello World".length(),"127.0.0.1",8088);

socket.send(package);

socket.close();

Sealed类:

在 Java 中,类继承是一个非常强大的特性,它允许我们创建一个类(子类)来扩展另一个类(父类)。然而,这种自由的继承机制有时也会导致问题,比如不可控的继承层次结构,这可能会使得代码难以维护和理解。

密封类就是为了解决这个问题而设计的。它使用 sealed 关键字来限制哪些类可以继承一个特定的类。这意味着你可以明确指出,只有特定的几个类可以作为某个类的子类。

sealed class Shape permits Circle, Square, Rectangle {}

在这个例子中,Shape 是一个密封类,它只允许 CircleSquare 和 Rectangle 作为其子类。

子类的声明

当你继承一个密封类时,你必须指定这个子类是 sealednon-sealed 还是 final

  • sealed:表示这个子类也可以有其他密封的或非密封的子类。
  • non-sealed:表示这个子类不能有子类,但它可以被其他类继承。
  • final:表示这个类不能被继承。

密封类的主要好处是它们可以帮助我们创建一个有限且可确定的类层次结构。这不仅使得我们的代码更加安全,防止了不受控制的继承,而且也使得我们的代码更加易于理解和维护。

IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的。

URL:统一资源定位符(英语UniformResourceLocator的缩写)俗称为网址(链接)。网址格式为:协议://域名或IP[:端口]/路径/文件名[参数=值]。结构中,协议://域名或IP是必需的,[]部分是可选的。如果端口与协议默认值不同,则需包含端口,省略则默认80端口。路径有时可省略。

查询域名对应的IP:以百度为例

在cmd中,输入:ping www.baidu.com,回车即可

 

在一个局域网中,每台机器都有一个主机名,用于主机与主机之间的便于区分,就可以为每台机器设置主机名,以便于以容易记忆的方法来相互访问。比如我们在局域网中可以为根据每台机器的功用来为其命名。

在局域网内,主机名是可以代替ip地址的。

主机名:即计算机名,给一台计算机取的名字(局域网)

在公网环境下,不要去理解主机名,它只是在局域网这个环境下的概念。而我们又可以把公网理解成较大的局域网。这样子想的话,其实域名和主机名就是指同一个东西。在实际场景中,我们可以通过域名解析获得IP地址,而主机名其实就是给计算机取了个名字。

局域网是一种用于连接处于相对狭小地理区域内计算机设备的网络。它是在较小的范围内实现连接和数据共享的计算机网络。局域网的范围可大可小,两台电脑也可以组建一个小的局域网,几百台电脑也可以通过高端设备组建成一个大型局域网。

局域网(Local Area Network)是指一个有限范围内的网络,通常包括一组相互连接的计算机、服务器、网络设备和通信媒介等。这些设备可以通过有线或无线方式进行连接,并通过网络协议进行通信和数据传输。局域网一般都是通过一些硬件设备组建的,需要有路由器、交换机、电脑等终端。

局域网的概念源于满足限定地理范围内的信息共享和资源共享的需求。它的范围通常局限于一个建筑物、办公室、校园或公司等小范围内。局域网的核心目标是提供高效、可靠且安全的通信环境,以满足用户之间进行信息传输和资源共享的需求。

局域网相比于广域网(Wide Area Network)来说,更为局限和专注于较小的范围。由于范围相对较小,局域网通常能够提供更高的传输速度和更低的延迟。这是因为局域网的设备相对靠近,传输的距离较短,可使用高速技术和设备进行通信。

局域网的基本概念之一是共享资源。局域网内的各个设备可以共享不同类型的资源,如打印机、扫描仪、存储设备等。这种资源共享使得用户能够更加方便地访问和利用这些设备,提高了工作效率和便利性。

对于计算机来说,远程通信依赖操作系统提供的Socket接口和互联网,所以调用Socket接口实现两台计算机通信就是计算机之间的远程通信方式。

Socket接口其实就是在计算机中提供了一个通信端口,两台具有Socket接口的计算机可以通过对应端口进行通信。

Socket被作为TCP/IP通信的实现基础,更是整个网络世界通信的基石。

一次简单的TCP通信就是调用Socket接口中的一些API完成的。但是在很多情况下,Socket接口并不是用于网络编程API的最佳选择。因为用Socket接口实现网络编程既复杂又繁琐,所以一些高级语言在此之上对这些API进行了封装,主要是为了简化Socket编程的复杂度,让开发人员无须关心底层的Socket细节,也无须花大量的时间去学习C语言的Socket库。

Java的Socket底层是使用C语言实现的。在Java中,Socket类是对底层操作系统提供的网络套接字接口的封装。Java通过JNI(Java Native Interface)技术调用了C语言编写的底层库来实现Socket功能。这样可以充分利用操作系统提供的网络功能,并且提高了性能和可移植性。

科大讯飞

不管是底层的Socket库,还是高级语言封装的Socket API,或者是网络应用程序框架(例如Netty),他们底层的原理都是一样的,他们只是一种远程通信的实现方案。

端口:可以认为是设备与外界通信交流的出口,所有的数据都是通过该出口与其他计算机或设备相连。

端口是一个假想的连接装置。

套接字(Socket):用于将应用程序与端口连接起来。

Java将套接字抽象化为类,程序设计者只需要创建Socket类对象,即可使用套接字。

IP地址是每个计算机在网络中的唯一标识。

1. IP地址封装:

Java提供了IP地址的封装类InetAddress,主要用于封装IP地址。

InetAddress类常用方法及其说明:

getByName(String host)InetAddress获取host相对应的InetAddress对象
getHostAddress()String获取InetAddress对象所含的IP地址
getHostName()String获取InetAddress对象的主机名
getLocalHost()InetAddress返回本地主机的InetAddress对象
isReachable(int timeOut)boolean在其时间内,测试是否可以到达该地址

InetAddress inetAddress = InetAddress.getByName("www.baidu.com");

InetAddress inetAddress = InetAddress.getLocalHost();

2. TCP程序设计

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP程序设计是指利用ServerSocket类和Socket类编写的网络通信程序。

服务器端程序创建一个ServerSocket(服务器套接字),调用accept()方法等待客户端来连接。

客户端程序创建一个Socket,请求与服务器建立连接。

服务器接收客户端的连接请求,同时创建一个新的Socket与客户端建立连接。服务器继续等待新的请求。

ServerSocket(int port): 创建绑定到特定端口的服务器套接字。

方法返回值说明
accept()Socket等待客户端的连接。若连接,则创建一个套接字
isBound()boolean判断ServerSocket的绑定状态
getInetAddress()InetAddress返回此服务器套接字的本地地址
isClosed()boolean返回服务器套接字的关闭状态
close()void关闭服务器套接字
bind(SocketAddress endpoint)void将ServerSocket绑定到特定地址(IP地址和端口号)
getLocalPort()int返回服务器套接字等待的端口号

ServerSocket类的常用方法及其说明

Socket(InetAddress address , int port): 创建一个套接字并将其连接到指定IP地址的指定端口。

方法返回值说明
bind(SocketAddress bindpoint)void将套接字绑定到本地地址
close()void关闭此套接字
connect(SocketAddress endpoint)void将此套接字连接到服务器
connect(SocketAddress endpoint, int timeout)void将此套接字连接到服务器,并指定一个超时值
getInetAddress()InetAddress返回套接字连接的地址
getInputStream()InputStream返回此套接字的输入流
getOutputStream()OutputStream返回此套接字的输出流

Socket类的常用方法及其说明

开发TCP网络程序时,使用服务器端套接字的accept()方法生成的Socket对象使用getOutputStream()方法获得的输出流将指向客户端Socket对象使用getInputStream()方法获得的对应输入流;

...也可以用getInputStream()...

未完待续>>>

3. UDP程序设计

UDP是User Datagram Protocol的缩写,中文名是用户数据报协议,它是网络信息传输的另一种形式。基于UDP的信息传递速度更快,但不提供可靠的保证。

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

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

相关文章

巡检机器人室内配电室应用

智能巡检系统实施背景 电力系统发展已进入电气化、自动化、智能化建设加速推进的新阶段,设备规模大幅增长,新设备、新技术加快应用,装备水平取得长足发展,与此同时设备规模大幅增长,新设备、新技术加快应用&#xff0…

JAVA并发编程高级——JDK 新增的原子操作类 LongAdder

LongAdder 简单介绍 前面讲过,AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong 时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,…

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…

蒂森电梯变频器维修CPIK40 CPIK32

维修范围&#xff1a; 1、通力电梯变频器维修&#xff1a;V3F16L,通力V3F18维修,电梯变频器V3F25维修,KDL16,KDL32维修&#xff0c;通力电梯CPU主板维修&#xff0c;806板&#xff0c;电梯安全回路板&#xff0c;LCECCB&#xff0c;LCECEB&#xff0c;电梯显示板维修&#xff…

Python编码系列—Python状态模式:轻松管理对象状态的变化

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录

概述 公司有个项目使用到Grafana作为监控界面,因为项目方的环境极其复杂,仅物理隔离的环境就有三四个,而且每个都得部署项目,今天在某个环境测试,查看界面遇到一个比较奇怪的Grafana问题,后面针对该问题进行跟踪分析并解决,故而博文记录,用于备忘。 问题 登录项目We…

CleanMyMac X v4.12.1 中文破解版 Mac优化清理工具

在数字时代&#xff0c;我们的Mac设备承载着越来越多的重要信息和日常任务。然而&#xff0c;随着时间的推移&#xff0c;这些设备可能会变得缓慢、混乱&#xff0c;甚至充满不必要的文件。这就是CleanMyMac X发挥作用的地方。 CleanMyMac X是一款功能强大的Mac优化工具&#…

Gson将对象转换为JSON(学习笔记)

JSON有两种表示结构&#xff0c;对象和数组。对象结构以"{"大括号开始&#xff0c;以"}"大括号结束。中间部分由0或多个以”&#xff0c;"分隔的”key(关键字)/value(值)"对构成&#xff0c;关键字和值之间以":"分隔&#xff0c;语法结…

C语言 | Leetcode C语言题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; #define HASH_FIND_LONG(head, findint, out) HASH_FIND(hh, head, findint, sizeof(long), out) #define HASH_ADD_LONG(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(long), add)struct HashTable {long key;int val;UT_ha…

LeetCode 热题 100 回顾20

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

数据结构串的kmp相关(求next和nextval)

傻瓜版&#xff0c;用来演示手算过程&#xff0c;个人理解用的&#xff0c;仅供参考。

Linux之进程概念

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux专栏 创作时间 &#xff1a;2024年9月28日 基本概念&#xff1a; 进程说白了其实就是一个程序的执行实例&#xff0c;正在执行的程序。 在内核层面来说&#xff0c;就是一个担当分配资源&#xff08;CPU时间…

如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试?

本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则&#xff0c;进而引入如何去编写一个好的单元测试&#xff0c;通义灵码是如何快速生成单元测试的。 通义灵码插件下载安装&#xff1a;通义灵码_智能编码助手_AI编程-阿里云 目录 什么是单元测试&…

CS 工作笔记:SmartEdit 里创建的是 CMS Component

下图是在 SmartEdit 里创建的 cms Component&#xff0c;在 Back-Office 里的截图&#xff1a; SAP Commerce Cloud 的 CMS Component 是其内容管理系统 (CMS) 的核心组成部分&#xff0c;它提供了对在线商店或平台内容的灵活管理。通过这些组件&#xff0c;用户能够在不涉及复…

MinIO使用客户端进行桶和对象的管理

MinIO使用客户端进行桶和对象的管理 minio安装完成后&#xff0c;除了自带的webui管理界面&#xff0c;还可以使用官方配套的客户端mc进行管理。除此之外&#xff0c;还可以使用第三方客户端s3browser也可以完成对象和桶的生命周期管理。 1. 官方客户端mc MinIO客户端 mc 命…

【STM32】TCP/IP通信协议--LWIP内存管理

五、LWIP内存管理 1.什么是内存管理&#xff1f; &#xff08;1&#xff09;内存管理&#xff0c;是指软件运行时对计算机内存资源的分配的使用的技术&#xff0c;其主要目的是如何高效、快速的分配&#xff0c;并且在适当的时候释放和回收内存资源&#xff08;就比如C语言当…

只申请一块sizeofimage的内存能否实现PE文件的拉伸

不能,别试了,浪费时间. 从最后一个节复制,也会被覆盖 BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer) {FILE* file (fopen(m_fileName, "rb"));if (file NULL){printf("error :%d", GetLastError());return FALSE;}// 从文…

【HyperWorks入门教程】HyperWorks的shrink warp meshing

在HyperWorks中&#xff0c;针对某些具有复杂几何特征的零部件的网格剖分&#xff0c;Altair HyperMesh 向用户提供了一种名为 Shrink Warp Meshing 的技术&#xff0c;快捷高效地完成有限元模型前处理工作。例如在车辆碰撞分析研究中&#xff0c;用户可以使用 Shrink Warp Mes…

3GPP链路级仿真-Link-Level Simulator for 5G Localization

文章目录 II. SYSTEM ARCHITECTURE AND CAPABILITIESA. System Architecture III. KEY COMPONENTSA. Transmission Models of the Positioning SignalsB. Dedicated Wireless Channel Model IV. APPLICATION CASESA. Two-Dimensional Mobile Terminal Localization仿真工作流程…

Spring+Mybatis IOC + AOP + 开启事务 模板

萌新小白刚入行Java 框架的可以试着自己拿着这个代码改一改,看看能不能运行成功 第一步:创建maven项目,在pom.xml文件中引入以下需要用到的jar包 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…