目录
前言:该程序是基于GUI界面和网络编程通过IO流实现图片发送的程序,在程序中定义了3个类,分别为客户端发送图片类,服务端接收图片类和一个发送图片工具类。
一:图片发送程序
图片发送程序的好处包括:
1. 方便快捷:使用图片发送程序可以轻松地将图片发送给其他人,无需复制粘贴或手动上传到其他平台。
2. 节省时间:通过图片发送程序,可以快速地将图片发送给多个人,节省了手动一个个发送的时间。
3. 保持图片质量:一些图片发送程序会保持图片的原始质量,避免了图片在传输过程中的压缩损失。
4. 方便整理:图片发送程序通常会提供整理、分类图片的功能,可以帮助用户更好地管理自己的图片库。
5. 安全保密:一些图片发送程序支持加密功能,可以确保图片在传输过程中的安全性和保密性。
6. 多平台适用:图片发送程序通常可在多个平台上使用,包括电脑、手机、平板等,方便用户在不同设备上进行图片发送。
二:简单程序的交互
客户端:
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
/**
* @author: dlwlrma
* @data 2024年06月24日 14:35
* @Description: TODO: 图片发送程序的客户端
*/
public class Client {
public static void main(String[] args) {
//获取关键字socket
try (
Socket socket = new Socket("192.168.81.1", 6060);
//C:\Users\22818\Pictures\Screenshots\demo01.jpg 发送的图片绝对路径
FileInputStream immage = new FileInputStream("C:\\Users\\22818\\Pictures\\Screenshots\\demo01.jpg");
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
){
byte[] bytes = new byte[4096];
int bytesRead;
System.out.println("图片正在发送中");
while(((bytesRead) = immage.read(bytes))!= -1){
outputStream.write(bytes,0,bytesRead);
}
System.out.println("图片已经发送完毕.......");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
服务端:
import java.net.Socket;
/**
* @author: dlwlrma
* @data 2024年06月24日 14:50
* @Description: TODO: 接收图片程序的服务端
*/
public class Server {
public static void main(String[] args) {
try (
ServerSocket serverSocket = new ServerSocket(6060);
Socket accept = serverSocket.accept();
DataInputStream dataInputStream = new DataInputStream(accept.getInputStream());
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\22818\\Pictures\\Screenshots\\receive1_image.jpg");
){
byte[] bytes = new byte[4096];
int bytesRead;
while(((bytesRead = dataInputStream.read(bytes)))!=-1){
fileOutputStream.write(bytes,0,bytesRead);
}
System.out.println("图片已接受");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
三:有GUI的网络交互
1.图片工具类
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 发送图片工具类
* @author dlwlrma
* @date 2024/6/26 22:13
* @return null
*/
public class ImageUtil {
public static byte[] imageToBytes(BufferedImage image, String format) throws IOException {
//以二进制字节的形式写入
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, format, baos);
return baos.toByteArray();
}
// 将字节数组转换为BufferedImage
public static BufferedImage bytesToImage(byte[] bytes) throws IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
return ImageIO.read(bais);
}
// 从文件加载图片
public static BufferedImage loadImage(String path) throws IOException {
return ImageIO.read(new File(path));
}
// 保存图片到文件
public static void saveImage(BufferedImage image, String path, String format) throws IOException {
ImageIO.write(image, format, new File(path));
}
}
发送图片客户端类
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
/**
* @author: dlwlrma
* @data 2024年06月26日 22:08
* @Description: TODO: 图片发送程序客户端实现
*/
public class ImageClient extends JFrame{
private Socket socket;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
public ImageClient() {
setTitle("图片发送客户端");
setSize(500, 500);
setBackground(Color.yellow);
//水平垂直居中
setLocationRelativeTo(null);
//关闭右上角的x号,程序就关闭了
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout());
//发送按钮,并设置背景颜色和大小
JButton btnSend = new JButton("发送图片^_^");
btnSend.setBackground(Color.GREEN);
btnSend.setSize(166,166);
//将按钮绑定到面板上
getContentPane().add(btnSend, BorderLayout.SOUTH);
//监听事件
btnSend.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendImages();
}
});
try {
socket = new Socket("192.168.81.1", 30000);
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void sendImages() {
//文件选择,可以定位到文件夹
JFileChooser FileChoose = new JFileChooser();
FileChoose.setMultiSelectionEnabled(true);
if (FileChoose.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File[] files = FileChoose.getSelectedFiles();
// 发送图片数量
try { dataOutputStream.writeInt(files.length);
//遍历file类型的数组,从工具类加载
for (File file : files) {
BufferedImage images = ImageUtil.loadImage(file.getAbsolutePath());
byte[] bytes = ImageUtil.imageToBytes(images, "jpg");
dataOutputStream.writeInt(bytes.length);
dataOutputStream.write(bytes);
}
//将资源刷新
dataOutputStream.flush();
//显示弹框消息
JOptionPane.showMessageDialog(this, "图片发送成功......");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//主程序,发送图片
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ImageClient client = new ImageClient();
client.setVisible(true);
});
}
}
接受图片服务器端
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author: dlwlrma
* @data 2024年06月26日 22:11
* @Description: TODO: 图片发送程序服务端实现
*/
public class ImageServer extends JFrame {
private ServerSocket serverSocket;
private Socket socket;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
public ImageServer() {
setTitle("图片接受服务端");
setSize(500, 500);
setBackground(Color.BLUE);
//水平垂直居中
setLocationRelativeTo(null);
//用户关闭窗口,程序也就终止了
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//内容面板布局为BorderLayout,分为上下左右中五部分
getContentPane().setLayout(new BorderLayout());
JButton buttonReceive = new JButton("接收图片^_^");
buttonReceive.setSize(200,200);
buttonReceive.setBackground(Color.GREEN);
getContentPane().add(buttonReceive, BorderLayout.SOUTH);
buttonReceive.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
receiveImages();
}
});
try {
serverSocket = new ServerSocket(30000);
socket = serverSocket.accept();
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
private void receiveImages() {
try {
// 读取图片
int numbers = dataInputStream.readInt();
for (int i = 0; i < numbers; i++) {
int length = dataInputStream.readInt();
byte[] bytes = new byte[length];
dataInputStream.readFully(bytes);
BufferedImage image = ImageUtil.bytesToImage(bytes);
//将图片保存到相应的存储文件位置
ImageUtil.saveImage(image, "D:/server/server_" + (i + 1) + ".jpg", "jpg");
}
//弹框提示
JOptionPane.showMessageDialog(this, "图片接受完毕....... 保存在 D:/server/ 文件夹中");
} catch (IOException ex) {
ex.printStackTrace();
}
}
//服务端主程序
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ImageServer server = new ImageServer();
server.setVisible(true);
});
}
}