目录
在我看来,我们在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 的进程建立了连接。
通过查看外部地址,可以了解到哪些计算机正在与本地计算机通信,并可以确定是否存在异常连接或攻击行为。


















