Compare commits

..

12 Commits

13 changed files with 440 additions and 1 deletions
@@ -15,7 +15,7 @@ import java.io.ObjectOutputStream;
*/ */
public class Demo09 { public class Demo09 {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Student student = new Student("张三", 18); Student student = new Student("张三", 18,"123456");
//获取序列化流对象,写出对象(将对象保存到文件中) //获取序列化流对象,写出对象(将对象保存到文件中)
FileOutputStream fos = new FileOutputStream("student.txt"); FileOutputStream fos = new FileOutputStream("student.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(fos);
@@ -0,0 +1,25 @@
package com.inmind.object_stream03;
import java.io.*;
/*
反序列化流读取对象(ObjectInputStream)
构造方法:
ObjectInputStream(InputStream in) 创建从指定的InputStream读取的ObjectInputStream。
常用方法:
Object readObject() 从ObjectInputStream读取一个对象。
*/
public class Demo10 {
public static void main(String[] args) throws Exception {
//使用反序列化流读取之前保存的学生对象
FileInputStream fis = new FileInputStream("student.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();//多态:父类引用指向子类对象
if (o instanceof Student) {
Student s = (Student) o;
System.out.println(s);
}
}
}
@@ -1,16 +1,36 @@
package com.inmind.object_stream03; package com.inmind.object_stream03;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
public class Student implements Serializable { public class Student implements Serializable {
@Serial
//固定一个序列化版本号即可
private static final long serialVersionUID = 2840703362371023312L;
String name; String name;
int age; int age;
/*
注意:
1.静态内容只跟类有关,跟对象无关,所以序列化时静态内容不能被保存的
2.transient表示瞬态,瞬间的值,被它修饰的成员变量,就不能序列化
*/
//static String password;//针对静态数据不能保存下来,但是会被共享,不符合业务
transient String password;//瞬态,该变量就不会被序列化
public Student(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
@Override @Override
public String toString() { public String toString() {
return "Student{" + return "Student{" +
"name='" + name + '\'' + "name='" + name + '\'' +
", age=" + age + ", age=" + age +
", password='" + password + '\'' +
'}'; '}';
} }
@@ -18,4 +38,9 @@ public class Student implements Serializable {
this.name = name; this.name = name;
this.age = age; this.age = age;
} }
public void method(){
System.out.println(1);
}
} }
@@ -0,0 +1,38 @@
package com.inmind.object_stream03;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/*
序列化流的练习
需求:
1. 将存有多个自定义对象的集合序列化操作,保存到list.txt文件中。
2. 反序列化list.txt ,并遍历集合,打印对象信息。
*/
public class Test11 {
public static void main(String[] args) throws Exception {
//1. 将存有多个自定义对象的集合序列化操作,保存到list.txt文件中。
ArrayList<Student> lists = new ArrayList<>();
lists.add(new Student("张三1", 18));
lists.add(new Student("张三2", 19));
lists.add(new Student("张三3", 20));
lists.add(new Student("张三4", 21));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
oos.writeObject(lists);
oos.close();
//2. 反序列化list.txt ,并遍历集合,打印对象信息。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
Object o = ois.readObject();
if (o instanceof ArrayList) {
ArrayList<Student> students = (ArrayList<Student>) o;
for (Student s : students) {
System.out.println(s);
}
}
}
}
@@ -0,0 +1,29 @@
package com.inmind.print_stream04;
import java.io.PrintStream;
/*
打印流的基本使用(PrintStream)(了解)
构造方法
PrintStream(String fileName) 使用指定的文件名创建新的打印流,无需自动换行
常用方法:
print():直接输出内容,但不换行
println():直接输出内容,但换行
*/
public class Demo12 {
public static void main(String[] args) throws Exception {
//往相对路径dest.txt中打印字符串
PrintStream ps = new PrintStream("dest.txt");
//调用打印输出功能
ps.println("我是谁");
ps.println("我在哪");
ps.print("我在干嘛");
ps.close();
// System.setOut(ps); 不要这么做
System.out.println("我是System打印的");
}
}
@@ -0,0 +1,37 @@
package com.inmind.print_stream04;
/*
IO流:字节流和字符流
字节输入输出流:
InputStream
OutputSteam
常用子类:
FileInputStream
FileOutputSteam
字符输入输出流:
Reader
Writer
常用子类:
FileReader
FileWriter
字节缓冲流:底层封装了个8192的数组提高读写效率
BufferedInputStream
BufferedOutputSteam
字符缓冲流:
BufferedReader
BufferedWriter
转换流:可以根据指定的编码方式进行读写数据(GBK UTF-8)
InputStreamReader
OutputSteamWriter
序列化流:
ObjectInputStream
ObjectOutputSteam
*/
public class Demo13 {
}
@@ -0,0 +1,21 @@
package com.inmind.network01;
/*
软件架构的分类:
C(client)/S(server):需要安装一个客户端,才能获取一些服务,比如桌面版腾讯会议,QQ,微信,爱奇艺,LOL(这不是我们今后的)
B(browser)/S(server):只需要一个浏览器,就可以获取一些服务,比如百度,淘宝,京东,爱奇艺网站(这是javaWEB方向)
网络编程--协议介绍:
HTTPHyperText Transfer Protocol,超文本传输协议):用于在万维网(WWW)中传输超文本数据,是浏览网页、获取网络资源的基础协议,比如你在浏览器中访问网页,就是通过 HTTP 协议进行数据交互 。
FTPFile Transfer Protocol,文件传输协议):专门用于在网络上进行文件的传输,支持用户上传、下载文件到 FTP 服务器,常被用于网站文件更新、资源共享等场景,像一些站长会用 FTP 工具向网站服务器上传网页文件 。
TFTPTrivial File Transfer Protocol,简单文件传输协议):相较于 FTP 更简单、轻量,不具备复杂的权限管理等功能,适用于对传输要求不高、简单的文件传输场景,比如在小型网络设备(路由器等)配置文件传输中可能会用到 。
SMTPSimple Mail Transfer Protocol,简单邮件传输协议):主要负责电子邮件的发送,把用户撰写的邮件从发件方邮件客户端或服务器发送到收件方的邮件服务器,是邮件系统中邮件传递的 “搬运工” 。
SNMPSimple Network Management Protocol,简单网络管理协议):用于管理网络中的设备(如路由器、交换机等),可以实现网络设备状态监测、性能统计、配置管理等功能,帮助网络管理员维护网络的正常运行 。
DNSDomain Name System,域名系统):负责将域名(如 www.example.com )解析为对应的 IP 地址,因为在网络中设备实际通过 IP 地址通信,有了 DNS ,人们就可以用好记的域名访问网站,而不用记住复杂的 IP 地址 。
*/
public class Demo01 {
}
@@ -0,0 +1,49 @@
package com.inmind.tcp03;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
TCP的客户端的实现
在java中使用一个类Socket表示客户端
构造方法:
Socket(String host, int port) 创建流客户端并将其连接到指定主机(IP地址)上的指定端口号。
参数一host:要请求服务的服务器的ip地址
参数二port:要请求服务的服务器上的软件端口号
常用方法:
void close() 关闭此套接字。
InetAddress getInetAddress() 返回套接字所连接的地址。
InputStream getInputStream() 返回此套接字的输入流.(接收响应数据的)
OutputStream getOutputStream() 返回此套接字的输出流。 (发送请求)
void shutdownOutput() 禁用此套接字的输出流 (设置了一个发送请求数据的结束标记)
客户端的实现步骤(对照IO图说明API的作用):
1.创建客户端对象
2.获取字节输出流发送请求数据
3.获取字节输入流接收响应数据
4.释放资源
*/
public class TcpClientDemo06 {
public static void main(String[] args) throws Exception {
//1.创建客户端对象192.168.23.107
Socket socket = new Socket("127.0.0.1", 10024);
//2.获取字节输出流发送请求数据
OutputStream os = socket.getOutputStream();
os.write("淘宝的官网".getBytes());
//告诉服务器,请求数据结束标记
socket.shutdownOutput();
//3.获取字节输入流接收响应数据
InputStream is = socket.getInputStream();
//一次读取一个字节数组
byte[] bytes = new byte[1024];
int len;
System.out.println("服务器响应的数据为:");
while ((len = is.read(bytes)) != -1) {
System.out.println(new String(bytes,0,len));
}
//4.释放资源
socket.close();
}
}
@@ -0,0 +1,55 @@
package com.inmind.tcp03;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
TCP服务器端代码的实现
在java中使用类ServerSocket表示服务器
构造方法:
ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
参数port:服务器软件的端口号
常用方法:
Socket accept() 接收客户端的请求,还将客户端的请求数据封装到服务器的Socket对象返回值中
InetAddress getInetAddress() 返回套接字所连接的地址。
InputStream getInputStream() 返回此套接字的输入流.(接收请求数据的)
OutputStream getOutputStream() 返回此套接字的输出流。 (发送响应数据)
void close() 关闭此套接字。
服务器的实现步骤:
1.创建服务器对象
2.接收客户端请求
3.获取请求数据
4.业务逻辑代码
5.发送响应数据
6.释放资源
*/
public class TcpServerDemo07 {
public static void main(String[] args) throws Exception {
//1.创建服务器对象
ServerSocket serverSocket = new ServerSocket(10024);
//2.接收客户端请求
Socket socket = serverSocket.accept();//阻塞的方法,等待客户端发来请求
System.out.println(socket.getInetAddress());//获取客户端的ip地址
//3.获取请求数据
InputStream is = socket.getInputStream();
//一次读取一个字节数组
byte[] bytes = new byte[1024];
int len;
System.out.println("客户端请求数据为:");
while ((len = is.read(bytes)) != -1) {
System.out.println(new String(bytes,0,len));//请求数据的展示
}
//4.业务逻辑代码
String result = "www.taobao.com";//要响应的数据
//5.发送响应数据
OutputStream os = socket.getOutputStream();
os.write(result.getBytes());
//6.释放资源
socket.close();
serverSocket.close();
}
}
+46
View File
@@ -0,0 +1,46 @@
package com.inmind.udp02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
UDP(印度飞饼)
1.面向无连接
2.传输不安全
3.传输数据有限制,64KB以内
在java中使用DatagramSocket来表示UDP的客户端和服务端
构造方法
DatagramSocket() 创建客户端的Socket对象,系统会随机分配一个端口号。
DatagramSocket(int port) 创建服务端的Socket对象,并指定端口号。
常用方法:
void send(DatagramPacket p) 发送数据包
void receive(DatagramPacket p) 使用数据包接收数据
DatagramPacket :数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 创建发出去的数据包对象
DatagramPacket(byte[] buf, int length) 创建接收数据的数据包对象
int getLength() 返回要发送的数据的长度或接收到的数据的长度
需求:使用UDP实现快速通信,实现1发1收
客户端的实现
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
//1创建客户端对象(丢飞饼的阿三)
DatagramSocket socket = new DatagramSocket();//随机分配端口
//2.创建数据包对象,封装要发出去的数据(创建一个飞饼)
byte[] bytes = "我爱java,java爱我".getBytes();
// DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),10022);
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,
InetAddress.getByName("192.168.23.174"),10022);
//3.客户端正式发送这个数据包出去
socket.send(packet);
System.out.println("客户端数据发送完毕~~");
socket.close();
}
}
+41
View File
@@ -0,0 +1,41 @@
package com.inmind.udp02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
作为UDP服务端,接收客户端发送的数据
在java中使用DatagramSocket来表示UDP的客户端和服务端
构造方法
DatagramSocket(int port) 创建服务端的Socket对象,并指定端口号。
常用方法:
void receive(DatagramPacket p) 使用数据包接收数据
DatagramPacket :数据包
DatagramPacket(byte[] buf, int length) 创建接收数据的数据包对象
int getLength() 返回要发送的数据的长度或接收到的数据的长度
需求:创建服务器,接收客户端的数据
*/
public class Demo03 {
public static void main(String[] args) throws Exception {
System.out.println("服务端启动了.....");
//1.创建服务端的对象(并指定端口号)
DatagramSocket socket = new DatagramSocket(10022);
//2.创建出一个数据包对象,用于接收数据(飞饼)
byte[] bytes = new byte[64 * 1024];//64KB
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3.服务器开始正式使用数据包,接收客户端的数据
socket.receive(packet);//阻塞方法,等待客户端发送的数据
//4.获取数据包的ip地址,和端口号
int length = packet.getLength();//获取数据包中字节数据的长度
String result = new String(bytes, 0, length);
System.out.println(packet.getPort());//获取数据包的端口
System.out.println(packet.getAddress().getHostAddress());//获取数据包的IP地址
System.out.println(result);
socket.close();//服务器资源释放
}
}
@@ -0,0 +1,46 @@
package com.inmind.udp02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
UDP多发多收
*/
public class UdpClientDemo04 {
public static void main(String[] args) throws Exception {
//1.创建客户端对象
DatagramSocket ds = new DatagramSocket();
//2.创建数据包发送数据
Scanner sc = new Scanner(System.in);
//3.不停地发,用户输入什么就发送什么
while (true) {
System.out.println("请输入:");
String line = sc.nextLine();//阻塞
if ("exit".equals(line)) {//这样写避免了空指针异常的可能性
break;
}
byte[] bytes = line.getBytes();
/*
public DatagramPacket(byte buf[], int offset, int length,
InetAddress address, int port)
参数一:封装要发出去的数据
参数二:发送出去的数据大小(字节个数)
参数三:服务端的IP地址(找到服务器主机)
参数四:服务端程序的端口号
*/
DatagramPacket dp = new DatagramPacket(
bytes, bytes.length,
InetAddress.getByName("192.168.23.107"), 10023);
//4.开始正式发送数据包
ds.send(dp);
}
System.out.println("程序结束");
}
}
@@ -0,0 +1,27 @@
package com.inmind.udp02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//启动服务器,不停地获取客户端的信息
public class UdpServerDemo05 {
public static void main(String[] args) throws Exception {
System.out.println("服务器启动");
//1.创建服务器对象
DatagramSocket ds = new DatagramSocket(10023);
//2.不停地获取数据包
byte[] buffer = new byte[1024 * 64];
while (true) {
//3.创建出一个数据包,用于接收客户端的数据
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
//4.服务器正式接收数据包
ds.receive(dp);
//5.将字节数据转为字符,并显示对应客户端的信息
int length = dp.getLength();//获取数据包中字节数据的长度
String result = new String(buffer, 0, length);
System.out.println(dp.getPort());//获取数据包的端口
System.out.println(dp.getAddress().getHostAddress());//获取数据包的IP地址
System.out.println(result);
}
}
}