A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴清源 中级黑马   /  2013-10-8 20:50  /  1650 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

使用Socket实现客户端与服务端之间的文件传输
  1. public class ClientSocketFrame extends JFrame {
  2.     private Image sendImg = null; // 声明图像对象
  3.     private Image receiveImg = null; // 声明图像对象
  4.     private SendImagePanel sendImagePanel = null; // 声明图像面板对象
  5.     private ReceiveImagePanel receiveImagePanel = null; // 声明图像面板对象
  6.     private File imgFile = null;// 声明所选择图片的File对象
  7.     private JTextField tf_path;
  8.     private DataInputStream in = null; // 创建流对象
  9.     private DataOutputStream out = null; // 创建流对象
  10.     private Socket socket; // 声明Socket对象
  11.     private Container cc; // 声明Container对象
  12.     private long lengths = -1;// 图片文件的大小
  13.    
  14.     private void connect() { // 连接套接字方法
  15.         try { // 捕捉异常
  16.             socket = new Socket("127.0.0.1", 1978); // 实例化Socket对象
  17.             while (true) {
  18.                 if (socket != null && !socket.isClosed()) {
  19.                     out = new DataOutputStream(socket.getOutputStream());// 获得输出流对象
  20.                     in = new DataInputStream(socket.getInputStream());// 获得输入流对象
  21.                     getServerInfo();// 调用getServerInfo()方法
  22.                 } else {
  23.                     socket = new Socket("127.0.0.1", 1978); // 实例化Socket对象
  24.                 }
  25.             }
  26.         } catch (Exception e) {
  27.             e.printStackTrace(); // 输出异常信息
  28.         }
  29.     }
  30.    
  31.     public static void main(String[] args) { // 主方法
  32.         ClientSocketFrame clien = new ClientSocketFrame(); // 创建本例对象
  33.         clien.setVisible(true); // 将窗体显示
  34.         clien.connect(); // 调用连接方法
  35.     }
  36.    
  37.     private void getServerInfo() {
  38.         try {
  39.             long lengths = in.readLong();// 读取图片文件的长度
  40.             byte[] bt = new byte[(int) lengths];// 创建字节数组
  41.             for (int i = 0; i < bt.length; i++) {
  42.                 bt[i] = in.readByte();// 读取字节信息并存储到字节数组
  43.             }
  44.             receiveImg = new ImageIcon(bt).getImage();// 创建图像对象
  45.             receiveImagePanel.repaint();// 重新绘制图像
  46.         } catch (Exception e) {
  47.         } finally {
  48.             try {
  49.                 if (in != null) {
  50.                     in.close();// 关闭流
  51.                 }
  52.                 if (socket != null) {
  53.                     socket.close(); // 关闭套接字
  54.                 }
  55.             } catch (IOException e) {
  56.                 e.printStackTrace();
  57.             }
  58.         }
  59.     }
  60.    
  61.     /**
  62.      * Create the frame
  63.      */
  64.     public ClientSocketFrame() {
  65.         super();
  66.         setTitle("客户端程序");
  67.         setBounds(100, 100, 373, 257);
  68.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  69.         
  70.         final JPanel panel = new JPanel();
  71.         getContentPane().add(panel, BorderLayout.NORTH);
  72.         
  73.         final JLabel label = new JLabel();
  74.         label.setText("路径:");
  75.         panel.add(label);
  76.         
  77.         tf_path = new JTextField();
  78.         tf_path.setPreferredSize(new Dimension(140, 25));
  79.         panel.add(tf_path);
  80.         
  81.         final JButton button = new JButton();
  82.         button.addActionListener(new ActionListener() {
  83.             public void actionPerformed(final ActionEvent e) {
  84.                 JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
  85.                 FileFilter filter = new FileNameExtensionFilter(
  86.                         "图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
  87.                 fileChooser.setFileFilter(filter);// 设置过滤器
  88.                 int flag = fileChooser.showOpenDialog(null);// 显示打开对话框
  89.                 if (flag == JFileChooser.APPROVE_OPTION) {
  90.                     imgFile = fileChooser.getSelectedFile(); // 获取选中图片的File对象
  91.                 }
  92.                 if (imgFile != null) {
  93.                     tf_path.setText(imgFile.getAbsolutePath());// 图片完整路径
  94.                     try {
  95.                         sendImg = ImageIO.read(imgFile);// 构造BufferedImage对象
  96.                     } catch (IOException ex) {
  97.                         ex.printStackTrace();
  98.                     }
  99.                 }
  100.                 sendImagePanel.repaint();// 调用paint()方法
  101.             }
  102.         });
  103.         button.setText("选择图片");
  104.         panel.add(button);
  105.         
  106.         final JButton button_1 = new JButton();
  107.         button_1.addActionListener(new ActionListener() {
  108.             public void actionPerformed(final ActionEvent e) {
  109.                 try {
  110.                     DataInputStream inStream = null;// 定义数据输入流对象
  111.                     if (imgFile != null) {
  112.                         lengths = imgFile.length();// 获得选择图片的大小
  113.                         inStream = new DataInputStream(new FileInputStream(
  114.                                 imgFile));// 创建输入流对象
  115.                     } else {
  116.                         JOptionPane.showMessageDialog(null, "还没有选择图片文件。");
  117.                         return;
  118.                     }
  119.                     out.writeLong(lengths);// 将文件的大小写入输出流
  120.                     byte[] bt = new byte[(int) lengths];// 创建字节数组
  121.                     int len = -1;
  122.                     while ((len = inStream.read(bt)) != -1) {// 将图片文件读取到字节数组
  123.                         out.write(bt);// 将字节数组写入输出流
  124.                     }
  125.                 } catch (IOException e1) {
  126.                     e1.printStackTrace();
  127.                 }
  128.             }
  129.         });
  130.         button_1.setText("发  送");
  131.         panel.add(button_1);
  132.         
  133.         final JPanel panel_1 = new JPanel();
  134.         panel_1.setLayout(new BorderLayout());
  135.         getContentPane().add(panel_1, BorderLayout.CENTER);
  136.         
  137.         final JPanel panel_2 = new JPanel();
  138.         panel_2.setLayout(new GridLayout(1, 0));
  139.         panel_1.add(panel_2, BorderLayout.NORTH);
  140.         
  141.         final JLabel label_1 = new JLabel();
  142.         label_1.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
  143.         label_1.setText("客户端选择的要发送的图片");
  144.         panel_2.add(label_1);
  145.         
  146.         final JLabel label_2 = new JLabel();
  147.         label_2.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
  148.         label_2.setText("接收到服务器端发送的图片     ");
  149.         panel_2.add(label_2);
  150.         
  151.         final JPanel imgPanel = new JPanel();
  152.         sendImagePanel = new SendImagePanel();
  153.         receiveImagePanel = new ReceiveImagePanel();
  154.         imgPanel.add(sendImagePanel);
  155.         imgPanel.add(receiveImagePanel);
  156.         final GridLayout gridLayout = new GridLayout(1, 0);
  157.         gridLayout.setVgap(6);
  158.         imgPanel.setLayout(gridLayout);
  159.         panel_1.add(imgPanel, BorderLayout.CENTER);
  160.         //
  161.     }
  162.    
  163.     // 创建面板类
  164.     class SendImagePanel extends JPanel {
  165.         public void paint(Graphics g) {
  166.             if (sendImg != null) {
  167.                 g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除绘图上下文的内容
  168.                 g.drawImage(sendImg, 0, 0, this.getWidth(), this.getHeight(),
  169.                         this);// 绘制指定大小的图片
  170.             }
  171.         }
  172.     }
  173.    
  174.     // 创建面板类
  175.     class ReceiveImagePanel extends JPanel {
  176.         public void paint(Graphics g) {
  177.             if (receiveImg != null) {
  178.                 g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除绘图上下文的内容
  179.                 g.drawImage(receiveImg, 0, 0, this.getWidth(),
  180.                         this.getHeight(), this);// 绘制指定大小的图片
  181.             }
  182.         }
  183.     }
  184. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马