1.基于SpringBoot,MybatisPlus的图像数据库管理
SpringBoot整合SSMP案例学习
数据库存储图像
2.SpringBoot整合JavaFX的BS架构
JavaFx使用及问题记录
3.Socket通信建立
全网最全的Java Socket通讯例子
Java的Socket连接同时传输图片、文本等多种信息
这里选用的是:使用Java的对象流。自定义一个类用于传输数据
Serializable 序列化:
什么是Serializable接口:一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化;
什么是序列化:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据;
为什么要序列化对象:把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化;
什么情况下需要序列化:当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
package tsd.usl.controller.utils;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DataFormatTsd implements Serializable {
//数据类型标志位
String data_flag = null; // images_quality,images_recognition,nums_accuracy,nums_score,
//nums
String nums = null; //拆分用","
//images
List<Picture> list_images = null;
@Override
public String toString() {
return "DataDemo1{" +
"data_flag='" + data_flag + '\'' +
", nums='" + nums + '\'' +
", list_images=" + list_images +
'}';
}
public DataFormatTsd() {
}
public DataFormatTsd(String data_flag, String nums, List<Picture> list_images) {
this.data_flag = data_flag;
this.nums = nums;
this.list_images = list_images;
}
public DataFormatTsd(String data_flag, List<Picture> list_images) {
this.data_flag = data_flag;
this.list_images = list_images;
}
public DataFormatTsd(String data_flag, String nums) {
this.data_flag = data_flag;
this.nums = nums;
}
public String getData_flag() {
return data_flag;
}
public void setData_flag(String data_flag) {
this.data_flag = data_flag;
}
public List<Picture> getList_images() {
return list_images;
}
public void setList_images(List<Picture> list_images) {
this.list_images = list_images;
}
public String getNums() {
return nums;
}
public void setNums(String nums) {
this.nums = nums;
}
//获取识别结果或者分数List<String>
public List<String> getNumslist(){
List<String> list = new ArrayList<>();
String[] ss = nums.split(",");
list = Arrays.asList(ss);
return list;
}
}
package tsd.usl.controller.utils;
import java.io.Serializable;
import java.util.Arrays;
public class Picture implements Serializable {
private byte[] pic_data;
public void setPic_data(byte[] pic_data) {
this.pic_data = pic_data;
}
public Picture() {
}
public Picture(byte[] pic_data) {
this.pic_data = pic_data;
}
@Override
public String toString() {
return "Picture{" +
"pic_data=" + Arrays.toString(pic_data) +
'}';
}
public byte[] getPic_data() {
return pic_data;
}
}
Socket长连接:
//按钮(打开连接)
public void connectbtnClicked(ActionEvent actionEvent) throws IOException {
//创建服务器,与连接ACCEPT相对应的发送接收线程
try {
System.out.println("Server start running...");
clientdetails.setText("客户端IP:" + "端口:");
ServerSocket serverSocket = new ServerSocket(8888);
// while(true){
Socket socketAccept = serverSocket.accept();
clientdetails.setText("客户端IP:" + socketAccept.getInetAddress() + "端口:" + socketAccept.getPort());
System.out.println("connect success...start thread...");
new Thread(new ServerListen(socketAccept)).start();//为每一个连接创建一个接收线程
new Thread(new ServerSend(socketAccept)).start();//为每一个连接创建一个发送线程
// }
}catch (Exception e){
e.printStackTrace();
}
}
//监听类 //为了创建线程,实现Runable,就要重写run()函数
private class ServerListen implements Runnable{
private Socket socketListen;
public ServerListen(Socket socketListen) {
this.socketListen = socketListen;
}
@Override
public void run() {//1.接收质量图片,2.接收准确率文本,3.接收质量分数文本
try {
ObjectInputStream ois = new ObjectInputStream(socketListen.getInputStream());
while(true){
//获取要检测质量的图片
Object obj = ois.readObject();
DataFormatTsd data = (DataFormatTsd) obj;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socketListen.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//发送类//
private class ServerSend implements Runnable{
private Socket socketSend;
public ServerSend(Socket socketSend) {
this.socketSend = socketSend;
}
// public ServerSend(Socket socketSend) {
// this.socketSend = socketSend;
// }
@Override
public void run() {
try {
ObjectOutputStream oos = new ObjectOutputStream(socketSend.getOutputStream());
// Scanner scanner = new Scanner(System.in);
while (true){
if(sendImagesflag.equals("imagesForDassess")){//发送用于识别的图片Listfile
System.out.println("send images for Dassess");
int[] nums = Utils.Randomnums(1,6,3);
System.out.println(nums.length+":"+nums[0]+nums[1]+nums[2]);
List<Picture> conP = new ArrayList<>();
for(int i = 0;i < nums.length;i++){
listdAddress.add("D:\\ImageDetectionCS\\demo1\\src\\main\\resources\\static\\" + balloonService.getById(nums[i]).getAddress());
listf_d.add(new File(listdAddress.get(i)));
list_dtype_right.add(balloonService.getById(nums[i]).getType());//balloon
Picture tp = new Picture();
tp.setPic_data(Utils.load_picture_from_file(listdAddress.get(i)));
conP.add(tp);
}
DataFormatTsd dafotImagesd = new DataFormatTsd("images_recognition",conP);
try {
oos.writeObject(dafotImagesd);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
sendImagesflag = "imagesForNone";
}else if(sendImagesflag.equals("imagesForQassess")){//发送用于质量评价的图片Listfile
sendImagesflag = "imagesForNone";
}else if(sendImagesflag.equals("imagesForNone")){
Thread.sleep(5000);
System.out.println("wait for send command......");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}