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