Java学习(韩顺平670-675)

目录

 在我看来,我们在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 的进程建立了连接。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值