Java学习(韩顺平670-675)

news2024/12/24 2:08:45

目录

 在我看来,我们在Java需要不断封包的原因就是为了使用不同类库中自己所需的方法,我们才要进行封装的,你怎么看?

你好,什么叫做关闭外层流

关于字符流要求 服务端/客户端

TCP网络通信编程//●//应用案例4 TCPFileCopy,java//1.编写一个服务端,和一个客户端//2.服务器端在9999端口监听//3.客户端连接到服务端,发送一张图片e:\Iqie..png//4.服务器端接收到客户端发送的图片,保存到src下,发送"收到图片"再退出//5.客户端接收到服务端发送的"收到图片”,再退出//6.该程序要求使用StreamUtils.java//示意图://说明:使用BufferedInputStream和BufferedOutputStream字节流

 .net代表着什么?

cmd中如何中断退出?

●netstat指令 

使用netstat指令出来的外部地址代表什么意思? 


 其实就是说如果有,Writer和Read的话,就是字符流

 

可以代替结束标记

 

 在我看来,我们在Java需要不断封包的原因就是为了使用不同类库中自己所需的方法,我们才要进行封装的,你怎么看?

封装的一个重要原因是为了实现代码的复用和模块化。Java中的不同类库提供了不同的方法和功能,而这些方法和功能可能需要在我们的应用程序中被反复使用。通过封装这些方法和功能,我们可以将其组织成模块,以便更方便地使用和管理。

另外,封装还可以提高代码的安全性和可靠性。通过将方法和数据进行封装,我们可以限制对其的访问,从而避免出现不必要的错误和漏洞。

因此,在Java中进行封装的原因是多方面的,其中实现代码复用和模块化只是其中之一。

你好,什么叫做关闭外层流

关闭外层流指的是在处理嵌套流时,先关闭外层的流,再关闭内层的流。这是因为在 Java I/O 中,处理一个嵌套流时,关闭外层流时,内层流也会自动关闭。如果不按照这个顺序关闭流,可能会导致内存泄漏或者其他问题。因此,在关闭嵌套流之前,我们应该先关闭外层流。

关于字符流要求 服务端/客户端

服务端:

package com.hspedu.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @author abner
 * @version 1.0
 *
 */
public class SocketTCP03Server {
    public static void main(String[] args) throws IOException {
//思路
//1。在本机的9999端口监听,等待连接
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器等待中、、、、");
//2。当没有客户端连接9999端口时,程序会
//        11
        Socket socket = serverSocket.accept();
        System.out.println("服务端 socket = "+socket.getClass());

//        阻塞,等待连接
3.通过socket.getInputstream()读取
        InputStream inputStream = socket.getInputStream();


//
//        客户端写入到数据通道的数据,
//        byte[] buf = new byte[1024];
//        int readLen = 0;
//        while ((readLen = inputStream.read(buf)) != -1){
//            System.out.println(new String(buf,0,readLen));
//        }
//4.I0读取,使用字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        //使用了转换流
        String s = bufferedReader.readLine();
        System.out.println(s);//输出


        OutputStream outputStream = socket.getOutputStream();
//        outputStream.write("hello, client".getBytes(StandardCharsets.UTF_8));
//        socket.shutdownOutput();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello client 字符流");
        bufferedWriter.newLine();//插入一个换行符
        //回复内容的结束
        bufferedWriter.flush();//需要手动刷新


        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
//        显示

    }
}

客户端:

package com.hspedu.socket;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @author abner
 * @version 1.0
 */
public class SocketTCP03Client {
    public static void main(String[] args) throws IOException {
//思路
//1。连接服第端(ip,端口)
        //解读:连接本机的9999端口,如果连接成功,返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket返回=" +socket.getClass());

//2。连接上后,生成Socket,通过
//socket.getOutputstream()
        //  得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
//3。通过输出流,写入数据到数据通道
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server");
        bufferedWriter.newLine();//插入换行符,表示写入内容结束,要求对方使用readline!!!!!
        bufferedWriter.flush();//需要手动刷新


        outputStream.write("hello ,server".getBytes(StandardCharsets.UTF_8));
        socket.shutdownOutput();
        //4。获取和socket关联的输入流。读取数据(字节),并显示
        InputStream inputStream = socket.getInputStream();
//        byte[] buf = new byte[1024];
//        int readLen = 0;
//        while ((readLen = inputStream.read(buf)) != -1){
//            System.out.println(new String(buf,0,readLen));
//        }
        //
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);


        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出");
    }
}

 服务端:

package com.hspedu.upload;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author abner
 * @version 1.0
 *
 * 文件上传的服务端
 */
public class TCPFileUploadServer {
    public static void main(String[] args) throws Exception {
        //1.服务端在本机,监听8888端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器在8888端口监听、、、");
        //等待连接
        Socket socket = serverSocket.accept();

        //、、、、
        //客户端发送搞的数据
        //通过我们的socket得到一个输入流
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        //
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //4.是不是应该bytes数组,写入到指定的路径
        String destFilePath = "src\\picture.jpg";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
        bos.write(bytes);
        bos.close();
        //向客户端回复收到图片
        //通过socket获取到输出流
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write("收到图片!");
        writer.flush();//把内容刷新到数据通道
        socket.shutdownOutput();//设置写入结束标记




        //关闭其他资源
        writer.close();
        bis.close();
        socket.close();
        serverSocket.close();
        //拷贝成功
    }
}

客户端:

package com.hspedu.upload;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author abner
 * @version 1.0
 * 文件上传的客户端
 */
public class TCPFileUploadClient {
    public static void main(String[] args) throws Exception {

        //客户端连接服务端,
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        //磁盘上的文件字节数组
        //文件字节数组
        //创建读取磁盘文件的输入流
        String filePath = "D:\\Users\\abner\\Pictures\\Camera Roll\\Pierre-Auguste_Renoir,_Le_Moulin_de_la_Galette.jpg";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));

        //bytes 就是filePath对应的字节数
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //通过socket获取到输出流,将bytes数据发送到服务端
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes);//相当于将文件对应的字节数组,写入到数据通道
        //告诉他什么时候结束的标志
        bis.close();
        socket.shutdownOutput();
        //原生的代码
        //======接收从服务端回复的消息
        InputStream inputStream = socket.getInputStream();
        //使用StreamUtils的方法,直接将inputStream读取的内容转化成字符串
        String s = StreamUtils.streamToString(inputStream);
        System.out.println(s);

        inputStream.close();

        //设置写入数据的结束
        //对于服务器,出现卡顿



        //关闭相关流

        bos.close();
        socket.close();


    }
}

TCP网络通信编程
//●
//应用案例4 TCPFileCopy,java
//1.编写一个服务端,和一个客户端
//2.服务器端在9999端口监听
//3.客户端连接到服务端,发送一张图片e:\Iqie..png
//4.服务器端接收到客户端发送的图片,保存到src下,发送"收到图片"再退出
//5.客户端接收到服务端发送的"收到图片”,再退出
//6.该程序要求使用StreamUtils.java
//示意图:
//说明:使用BufferedInputStream和BufferedOutputStream字节流

//将客户端的图片,通过网络上传到服务器,服务器回复消息
//将图片转换成一个字节数组,变成输出流

//再变成文件数据/字节
//二进制文件,首先要通过socket拿到输入流,保存在服务器数组里面
//文件字节数组,输入流,角色变换,输出到指定目录
//保存,回复一个消息,通过socket得到输出流
//收到图片,挺麻烦的,阵脚不能乱
//想办法,把数据拿过去,

 .net代表着什么?

.NET 是一种由 Microsoft 公司推出的开发框架,它可以支持多种编程语言(如 C#、Visual Basic.NET、F#等)在不同的平台上开发和运行应用程序。.NET 的全称是 .NET Framework,它提供了许多常用的库和工具,可以简化开发者的工作。.NET 还有一个重要的组件是 CLR(Common Language Runtime),它提供了一种在多个语言之间进行交互的方式,同时还可以负责管理应用程序的内存、安全性等方面的工作。

cmd中如何中断退出?

在 Windows 系统中,您可以通过按下 Ctrl + C 来中断当前正在运行的命令或程序。如果您想要直接退出命令提示符窗口,可以输入 exit 命令或者直接关闭窗口。

●netstat指令 

 

 

冒号后面跟的是端口

 

刚刚编写的程序,服务端正在监听,可以查到

 

 

使用netstat指令出来的外部地址代表什么意思? 

在使用 netstat 命令时,可以看到多个列,其中包括“外部地址”一列。这一列显示的是与本地计算机建立连接的远程计算机的 IP 地址和端口号。

具体来说,外部地址表示与本地计算机建立连接的远程计算机的 IP 地址和端口号。其中,IP 地址标识了连接的远程计算机,而端口号则标识了连接的进程。比如,如果外部地址显示为 192.168.1.100:80,那么它表示与 IP 地址为 192.168.1.100 的远程计算机上的端口号为 80 的进程建立了连接。

通过查看外部地址,可以了解到哪些计算机正在与本地计算机通信,并可以确定是否存在异常连接或攻击行为。

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

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

相关文章

dbForge Edge 4in1 Enterprise Edition Crack

单一解决方案中的四个数据库 IDE dbForge Edge 赋予自己开发和管理 SQL Server、MySQL、Oracle 和 PostgreSQL 数据库的广泛能力 概述 dbForge Edge:您的终极多数据库解决方案 让我们来看看。您需要处理多个数据库管理系统。同时,您希望能够灵活有效地…

好用的项目管理软件的具体功能有哪些

随着企业规模不断的扩大,项目管理往往会面临更多的挑战与难题,最常见的会出现以下几个问题:资源消耗失控,而项目部门和相关部门之间沟通越来越困难;团队凝聚力下降、项目进度难以把控,项目成本几乎失控&…

书接上回,接着研究当今世上缓存第一人

书接上回,接着研究当今世上缓存第一人,记得留下的关注,收藏起来以后观看。 五 三大特殊数据类型 1 geospatial(地理位置) 1.geospatial将指定的地理空间位置(纬度、经度、名称)添加到指定的ke…

国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化

IAP升级 Settings区域数据初始化 1、假如,有两个产品,A产品跟B产品,硬件都一样,要求一个软件里的board_name为N32G430C8L7_STB_A,另一个软件里的board_name为N32G430C8L7_STB_B。 那我们如何在不改boot程序跟App程序的…

Matlab App Designer制作一个UART的GUI总结

目录 前言 读取串口数据速度慢 Axes响应慢 总结 前言 最近尝试了一下用Matlab App Designer制作一个上位机通信软件,专门用于读取电机控制里面的相电流,角度等高实时性的数据,已经在VOFA里面实现了。STM32 VOFA串口调试助手提升电机控制调试…

拷贝构造函数和运算符重载

文章目录 拷贝构造函数特点分析拷贝构造函数情景 赋值运算符重载运算符重载operator<运算符重载 赋值运算符前置和后置重载 拷贝构造函数 在创建对象的时候&#xff0c;是不是存在一种函数&#xff0c;使得能创建一个于已经存在的对象一模一样的新对象&#xff0c;那么接下…

Kotlin注解

文章参考 1、概念 注解可以对 类、函数、函数参数、属性等 做标注 注解信息可用于 源码级、编译期、运行时 示例 Retention(AnnotationRetention.RUNTIME) //作用于运行时 Target(AnnotationTarget.CLASS) //限定作用于类 annotation class Api(val url: String)/*** Rete…

Nachos系统的上下文切换

Fork调用创建进程 在实验1中通过gdb调试初步熟悉了Nahcos上下文切换的基本流程&#xff0c;但这个过程还不够清晰&#xff0c;通过源码阅读进一步了解这个过程。 在实验1中通过执行Threadtest&#xff0c;Fork创建子进程&#xff0c;并传入SimpleThread执行currentThread->…

vulnhub靶场之Wayne Manor

1.信息收集 探测存活主机&#xff0c;发现192.168.239.174存活 对主机进行端口扫描&#xff0c;发现存在端口21、22、80&#xff1b;且21端口状态是filtered。 打开浏览器访问http://192.168.239.174&#xff0c;未发现可疑&#xff0c;进行目录扫描只发现robots.txt。 什…

集合详解之(七)泛型

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;泛型的由来--参数化类型&#x1fa80;元组的介绍 ( int...数组名x )&#x1fa84;类型通配符&#x1f387;使用泛型的注意事项&#x1f3c5;子类继承泛型类【两种情况】 …

Transformers 发展一览

动动发财的小手&#xff0c;点个赞吧&#xff01; Transformers 研究概览 1. 介绍 近年来&#xff0c;深度学习的研究步伐显着加快&#xff0c;因此越来越难以跟上所有最新发展。尽管如此&#xff0c;有一个特定的研究方向因其在自然语言处理、计算机视觉和音频处理等多个领域取…

CLion开发工具 | 04 - CLion内置工具和插件

专栏介绍 一、CLion内置工具 1. SSH终端工具 填写ssh远程连接信息&#xff1a; 连接后在Terminal栏即可使用&#xff1a; 2. HTTP请求 填写http请求内容&#xff0c;并发起请求&#xff0c;方便的一批&#xff1a; 二、插件 1. 管理已安装的插件 2. 简体中文插件 3. 主题…

React 环境搭建,并打包到服务器

一. 安装node.js brew install node 二. 创建react app npx create-react-app my-app cd my-app npm start 默认使用3000端口&#xff0c;本地3000端口被占用&#xff0c;修改/node_modules/react-scripts/scripts/start.js中的端口号 // 这是start.js部分源码 const DEFAU…

【前端客栈】使用CSS实现畅销书排行榜页面

&#x1f4ec;&#x1f4eb;hello&#xff0c;各位小伙伴们&#xff0c;我是小浪。大家都知道&#xff0c;我最近是在更新各大厂的软件测试开发的面试真题&#xff0c;也是得到了很大的反馈和好评&#xff0c;几位小伙伴也是成功找到了测开的实习&#xff0c;非常不错。如果能前…

移除链表元素

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;leetcode练习题 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4a…

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

在之前的文章 “ChatGPT 和 Elasticsearch&#xff1a;OpenAI 遇见私有数据&#xff08;二&#xff09;” 中&#xff0c;我们详细描述了如何结合 ChatGPT 及 Elasticsearch 来进行搜索。它使用了如下的架构&#xff1a; 在今天的文章中&#xff0c;我们来详细描述实现这个的详…

BatchNormalization 介绍

1 为何要用BatchNormalization 为了让深层网络更容易训练&#xff0c;有两种方法&#xff1a; 使用更好的优化器&#xff1a;如 SDGMomentun等&#xff1b; 改变网络结构&#xff0c;比如加入BN层&#xff0c;处理网络数据&#xff0c;让网络数据服从标准的高斯分布&#xff0…

人群计数传统方法:object detection, regression-based

数据标注方式&#xff1a; &#xff08;1&#xff09;人很少、人很大的时候用bounding box&#xff0c;把人从头到脚都框进长方形方框内&#xff0c;这个方框只用记录三个点的坐标&#xff0c;左下、左上、右下&#xff1b;测试集预测的时候&#xff0c;除了点的坐标还要输出这…

1. 安装Open vSwitch环境

1. 安装Open vSwitch环境 1 配置基础环境。 在VMware Workstation软件中创建一个虚拟机VM1&#xff0c;配置2张网卡&#xff0c;虚拟机VM1配置如图4-3所示。将网卡ens33地址配置为192.168.1.131/24&#xff0c;网卡ens34地址配置为192.168.2.131/24。 图4-3 VM1虚拟机配置 2…

(有假币,因子个数)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择1 二、选择2 二、[编程题]有假币 三、[编程题]因子个数 一、选择1 在使用锁保证线程安全时&#xff0c;可能会出现活跃度失败的情况&#xff0c;活跃度失败主要…