让你在你的朋友面前炫酷的小程序

目录

一:图片发送程序

二:简单程序的交互

 三:有GUI的网络交互


前言:该程序是基于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);
        });
    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值