java 实现局域网文件传输的实例

java 实现局域网文件传输的实例

本文主要实现局域网文件传输的实例,对java 的TCP知识,文件读写,Socket等知识的理解应用,很好的实例,大家参考下,

实现代码:

ClientFile.java

/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
 package com.tcp.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JProgressBar;

public class ClientFile extends Thread {

  private static String ip;
  private static int port;
  private String filepath;
  private long size;
  private JProgressBar jprogressbar;
  public ClientFile(String ip, int port, String filepath, JProgressBar jprogressbar) {
    this.ip = ip;
    this.port = port;
    this.filepath = filepath;
    this.jprogressbar = jprogressbar;
  }
  public void run() {
    try {
      Socket socket = new Socket(ip, port);
      InputStream input = socket.getInputStream();
      OutputStream output = socket.getOutputStream();

      File file = new File(filepath);
      // 第一次传输文件名字and文件的大小
      String str1 = file.getName() + "\t" + file.length();
      output.write(str1.getBytes());
      output.flush();
      byte[] b = new byte[100];
      int len = input.read(b);
      String s = new String(b, 0, len);
      // 如果服务器传输过来的是ok那么就开始传输字节
      if (s.equalsIgnoreCase("ok")) {
        long size = 0;
        jprogressbar.setMaximum((int) (file.length() / 10000));// 设置进度条最大值
        FileInputStream fin = new FileInputStream(file);
        byte[] b1 = new byte[1024 * 1024 * 2];
        while (fin.available() != 0) {
          len = fin.read(b1);
          output.write(b1, 0, len);
          output.flush();
          size += len;
          jprogressbar.setValue((int) (size / 10000));
        }
        if (fin.available() == 0) {
          javax.swing.JOptionPane.showMessageDialog(null, "传输完毕!即将推出......");
          try {
            Thread.sleep(1500);
            System.exit(0);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        output.close();
        fin.close();
        socket.close();
      } else {
        // 传输的不是ok那么就弹出个信息框对方拒绝
        javax.swing.JOptionPane.showMessageDialog(null, "对方拒绝接收此数据!");
      }
    } catch (IOException e) {
      javax.swing.JOptionPane.showMessageDialog(null, "IOException");
    }
  }

}

ServerFile.java

/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
 package com.tcp.file;

import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class ServerFile extends Thread {

  private Socket socket;
  private JProgressBar jprogressbars;

  public ServerFile(Socket socket, JProgressBar jprogressbars) {
    this.socket = socket;
    this.jprogressbars = jprogressbars;
  }

  public void run() {
    try {
      InputStream input = socket.getInputStream();
      OutputStream output = socket.getOutputStream();

      byte[] b = new byte[100];
      int len = input.read(b);
      String ss = new String(b, 0, len);
      String[] str1 = ss.split("\t");// 把接收到的信息按制表符拆分
      String filename = str1[0];// 起始位文件名称
      String filesize = str1[1];// 下标1位文件的大小
      long size = Long.parseLong(filesize);

      InetAddress ip = socket.getInetAddress();// 得到发送端的IP
      int port = socket.getPort();// 得到发送端的端口

      long s = size / 1024 / 1024;
      String name = " M";
      if (s < 1) {
        s = (size / 1024);
        name = " K";
      } else if (s > 1024) {
        float s1 = size / 1024 / 1024;
        s = (size / 1024 / 1024 / 1024);
        name = " G多";
      }
      // 弹出确认款,显示对方的ip端口以及文件的名称和大小是否需要接收
      int i = JOptionPane.showConfirmDialog(null,
          "来自: " + ip + ":" + port + "\n文件名称: " + filename + "\n文件大小: " + s + name);

      // 如果点击确认
      if (i == JOptionPane.OK_OPTION) {
        // 那么传输ok给发送端示意可以接收
        output.write("ok".getBytes());
        output.flush();
        JFileChooser jf = new JFileChooser();
        // 存储到本地路径的夹子
        jf.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jf.showOpenDialog(null);
        jprogressbars.setMaximum((int) (size / 10000));
        FileOutputStream fout = new FileOutputStream(new File(jf.getSelectedFile(), filename));
        b = new byte[1024 * 1024 * 2];
        long size1 = 0;
        while ((len = input.read(b)) != -1) {
          fout.write(b, 0, len);
          size1 += len;
          jprogressbars.setValue((int) (size1 / 10000));
        }
        fout.close();
        input.close();
        socket.close();

      } else {
        // 否不接收此文件
        output.write("no".getBytes());
        output.flush();
      }
    } catch (IOException e) {
      javax.swing.JOptionPane.showMessageDialog(null, "IOException");
    }

  }
  private static ServerSocket server = null;
  // 启动服务器
  public static void openServer(int port, JProgressBar jprogressbar) throws Exception {
    new Thread() {
      public void run() {
        try {
          if (server != null && !server.isClosed()) {
            server.close();
          }
          server = new ServerSocket(port);
          new ServerFile(server.accept(), jprogressbar).start();
        } catch (IOException e) {
          javax.swing.JOptionPane.showMessageDialog(null, "IOException");
        }
      }
    }.start();
  }

  // 关闭服务器
  public static void closeServer() {
    try {
      server.close();
    } catch (IOException e) {
      javax.swing.JOptionPane.showMessageDialog(null, "IOException");
    }
  }

}

SocketFileJFrame.java

/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
 package com.tcp.file;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import javax.swing.JTabbedPane;
import java.awt.Panel;
import javax.swing.border.TitledBorder;
import javax.swing.UIManager;
import javax.swing.border.CompoundBorder;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.JProgressBar;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.awt.event.ActionEvent;

public class SocketFileJFrame extends JFrame {

  private JPanel contentPane;
  private JTextField textField;
  private JTextField textField_1;
  private JTextField textField_2;
  private JTextField textField_3;
  private JProgressBar progressBar_2;

  /**
   * Launch the application.
   */
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          SocketFileJFrame frame = new SocketFileJFrame();
          frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  /**
   * Create the frame.
   */
  public SocketFileJFrame() {
    setIconImage(Toolkit.getDefaultToolkit()
        .getImage(SocketFileJFrame.class.getResource("/javax/swing/plaf/metal/icons/ocean/newFolder.gif")));
    setForeground(Color.WHITE);

    setResizable(false);
    setTitle("局域网文件传输 V1.0");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    int width = Toolkit.getDefaultToolkit().getScreenSize().width;//获取分辨率宽
    int heiht = Toolkit.getDefaultToolkit().getScreenSize().height;//获取分辨率高

    //分辨率宽高减去软件的宽高除以2把软件居中显示
    setBounds((width - 747) / 2, (heiht - 448) / 2, 738, 472);
    contentPane = new JPanel();
    contentPane.setBackground(Color.WHITE);
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JPanel panel_1 = new JPanel();
    panel_1.setToolTipText("");
    panel_1.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"),
        "\u6587\u4EF6\u63A5\u6536\u670D\u52A1\u5668", TitledBorder.LEADING, TitledBorder.TOP, null,
        new Color(0, 0, 0)));
    panel_1.setBackground(Color.WHITE);
    panel_1.setBounds(39, 28, 652, 119);
    contentPane.add(panel_1);
    panel_1.setLayout(null);

    JLabel label = new JLabel("\u7AEF\u53E3:");
    label.setFont(new Font("新宋体", Font.PLAIN, 22));
    label.setBounds(26, 31, 66, 35);
    panel_1.add(label);

    //端口文本框
    textField = new JTextField();
    textField.setFont(new Font("宋体", Font.PLAIN, 19));
    textField.setText("8080");
    textField.setBounds(89, 36, 126, 26);
    panel_1.add(textField);
    textField.setColumns(10);

    //服务器关闭启动的按钮
    JToggleButton tglbtnNewToggleButton = new JToggleButton("\u542F\u52A8\u670D\u52A1\u5668");
    tglbtnNewToggleButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {

        if (tglbtnNewToggleButton.isSelected()) {
          //如果是按下显示关闭服务器
          tglbtnNewToggleButton.setText("关闭服务器");
          textField.setEnabled(false);//按下之后 端口文本框要设置不能写入
          try {
            //启动服务器
            ServerFile.openServer(Integer.parseInt(textField.getText())
                , progressBar_2);
          } catch (Exception e1) {
            javax.swing.JOptionPane.showMessageDialog(null, "Exception");
          }
        } else {
          //否启动服务器
          tglbtnNewToggleButton.setText("启动服务器");
          textField.setEnabled(true);////弹起之后 端口文本框要设置可写状态
          ServerFile.closeServer();//关闭服务器
        }

      }
    });
    tglbtnNewToggleButton.setFont(new Font("微软雅黑 Light", Font.PLAIN, 19));
    tglbtnNewToggleButton.setBackground(Color.WHITE);
    tglbtnNewToggleButton.setForeground(Color.DARK_GRAY);
    tglbtnNewToggleButton.setBounds(345, 34, 138, 28);
    panel_1.add(tglbtnNewToggleButton);

    //文件接收端的进度条
    progressBar_2 = new JProgressBar();
    progressBar_2.setBackground(Color.WHITE);
    progressBar_2.setForeground(new Color(255, 218, 185));
    progressBar_2.setStringPainted(true);
    progressBar_2.setBounds(460, 101, 190, 14);
    panel_1.add(progressBar_2);

    JPanel panel_2 = new JPanel();
    panel_2.setToolTipText("");
    panel_2.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\u6587\u4EF6\u4F20\u8F93\u7AEF",
        TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
    panel_2.setBackground(Color.WHITE);
    panel_2.setBounds(39, 191, 652, 202);
    contentPane.add(panel_2);
    panel_2.setLayout(null);

    //文件传输端的进度条
    JProgressBar progressBar_1 = new JProgressBar();
    progressBar_1.setFont(new Font("宋体", Font.PLAIN, 18));
    progressBar_1.setStringPainted(true);
    progressBar_1.setForeground(new Color(240, 128, 128));
    progressBar_1.setBackground(Color.WHITE);
    progressBar_1.setBounds(96, 169, 472, 20);
    panel_2.add(progressBar_1);

    JLabel lblIp = new JLabel("IP\u5730\u5740:");
    lblIp.setFont(new Font("微软雅黑 Light", Font.PLAIN, 20));
    lblIp.setBounds(26, 44, 70, 27);
    panel_2.add(lblIp);

    //IP地址文本框
    textField_1 = new JTextField();
    textField_1.setText("127.0.0.1");
    textField_1.setFont(new Font("新宋体", Font.PLAIN, 20));
    textField_1.setBounds(96, 44, 184, 30);
    panel_2.add(textField_1);
    textField_1.setColumns(10);

    JLabel label_1 = new JLabel("\u7AEF\u53E3:");
    label_1.setFont(new Font("微软雅黑 Light", Font.PLAIN, 20));
    label_1.setBounds(308, 42, 80, 30);
    panel_2.add(label_1);

    //端口文本框
    textField_2 = new JTextField();
    textField_2.setText("8080");
    textField_2.setFont(new Font("新宋体", Font.PLAIN, 20));
    textField_2.setColumns(10);
    textField_2.setBounds(359, 44, 80, 30);
    panel_2.add(textField_2);

    //打开本地路径的按钮
    JButton button = new JButton("...");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        JFileChooser jf = new JFileChooser();
        jf.setFileSelectionMode(JFileChooser.FILES_ONLY);
        jf.showOpenDialog(SocketFileJFrame.this);
        textField_3.setText(jf.getSelectedFile().getPath());
      }
    });
    button.setBackground(Color.WHITE);
    button.setBounds(533, 51, 35, 20);
    panel_2.add(button);

    JLabel label_2 = new JLabel("\u8DEF\u5F84:");
    label_2.setFont(new Font("微软雅黑 Light", Font.PLAIN, 15));
    label_2.setBounds(489, 50, 44, 18);
    panel_2.add(label_2);

    //显示文件路径框
    textField_3 = new JTextField();
    textField_3.setEnabled(false);
    textField_3.setFont(new Font("微软雅黑 Light", Font.PLAIN, 20));
    textField_3.setBounds(96, 100, 343, 38);
    panel_2.add(textField_3);
    textField_3.setColumns(10);

    JLabel lblNewLabel = new JLabel("\u6587\u4EF6:");
    lblNewLabel.setFont(new Font("等线 Light", Font.PLAIN, 25));
    lblNewLabel.setBounds(33, 97, 56, 38);
    panel_2.add(lblNewLabel);
    //确定按钮
    JButton button_1 = new JButton("\u786E\u5B9A");
    button_1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {

        ClientFile client = new ClientFile(
            textField_1.getText(), Integer.parseInt(textField_2.getText()),
            textField_3.getText(), progressBar_1);
        client.start();
      }
    });
    button_1.setForeground(new Color(255, 255, 0));
    button_1.setBackground(new Color(233, 150, 122));
    button_1.setFont(new Font("微软雅黑 Light", Font.BOLD, 20));
    button_1.setBounds(475, 100, 91, 38);
    panel_2.add(button_1);
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java Socket实现文件传输示例代码

    最近学Socket学上瘾了,就写了一个简单的文件传输程序. 客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端.传输的进度打印到控制台中,直到传输完成. 服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名. 下面是客户端和服务端的代码实现: 客户端代码: import java.io.DataOutpu

  • Java基于TCP方式的二进制文件传输

    一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1.基于Java Socket的二进制文件传输(包括图片,二进制文件,各种文档work,PDF) 2.SwingWorker集合JProgressBar显示实时传输/接受完成的百分比 3.其它一些Swing多线程编程技巧 首先来看一下整个Dome的Class之间的关系图: 下面按照上图来详细解释各个类的

  • Java基于Socket的文件传输实现方法

    本文实例讲述了Java基于Socket的文件传输实现方法.分享给大家供大家参考,具体如下: 1. Java代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Ser

  • 浅析Java基于Socket的文件传输案例

    本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下 1.Java代码 package com.wf.demo.socket.socketfile; import java.net.*; import java.io.*; /** * 2.socket的Util辅助类 * * @author willson * */ public class ClientSocket { private String ip; private int port; private

  • Java IO流 文件传输基础

    一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s="好好学习ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是

  • 基于socket和javaFX简单文件传输工具

    本文实例介绍了基于socket和javaFX简单文件传输工具,分享给大家供大家参考,具体内容如下 package application; import java.io.File; import org.james.component.ButtonBox; import org.james.component.FileReceiverGrid; import org.james.component.FileSenderGrid; import javafx.application.Applica

  • java 实现局域网文件传输的实例

    java 实现局域网文件传输的实例 本文主要实现局域网文件传输的实例,对java 的TCP知识,文件读写,Socket等知识的理解应用,很好的实例,大家参考下, 实现代码: ClientFile.java /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ package com.tcp.file; import java.io.File; import java.io.FileInputStream; import java.io.

  • Java IO 之文件读写简单实例

    Java IO 之文件读写简单实例 1.文件读 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字

  • Java 读取excel 文件流代码实例

    这篇文章主要介绍了Java 读取excel 文件流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public static void initType(String path) { try { //1 获取excel文件流 excel xls 文件 暂不支持xlsx if (path.contains("xlsx") || path.contains("XLSX")) { System.err.

  • python单线程文件传输的实例(C/S)

    客户端代码: #-*-encoding:utf-8-*- import socket import os import sys import math import time def progressbar(cur, total): percent = '{:.2%}'.format(float(cur) / float(total)) sys.stdout.write('\r') sys.stdout.write("[%-50s] %s" % ( '=' * int(math.flo

  • java io读取文件操作代码实例

    这篇文章主要介绍了java io读取文件操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要分为字节读取和字符读取,字节读取可以一个一个读取和字节数组读取,字符读取同样之,字符读取适合文本读取,字节读取皆可以 这里直接上代码,读取文件的9个小demo package com.io; import org.junit.Test; import java.io.*; public class FileTest { //1.字节流字节一个

  • Delphi实现木马文件传输代码实例

    本文以实例形式讲述了Delphi下木马的文件传输方法的实现过程,具体步骤如下: 服务器端代码: unit ServerFrm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls,WinSock; type TfrmMain = class(TForm) Panel1: TPanel; Labe

  • Java IO流 文件的编码实例代码

    •文件的编码 package cn.test; import java.io.UnsupportedEncodingException; public class Demo15 { public static void main(String[] args) throws UnsupportedEncodingException { String str = "你好ABC123"; byte[] b1 = str.getBytes();//转换成字节系列用的是项目默认的编码 for (

  • java读取properties文件的方法实例分析

    本文实例讲述了java读取properties文件的方法.分享给大家供大家参考.具体分析如下: 1.不在项目中读取: Properties properties = new Properties(); BufferedReader read = new BufferedReader(new InputStreamReader(new FileInputStream("文件的路径"),"utf-8")); properties.load(read); properti

  • java解析Excel文件的方法实例详解

    目录 介绍 1.1 pom依赖 1.2 将数据流转化为可解析的Workbook类型文件 1.3 解析 1.4 Controller层接收前端传递的Excel文件(前端使用Element-ui的<el-upload>组件) 1.5 ServiceIMPL层解析Excel文件并将解析结果返回 1.6 前端VUE实现Excel文件的上传(使用Element-ui的<el-upload>组件) 总结 在做一个项目时,有很多原本保存在Excel文件中的基础数据,如此则需要一个Excel文件解

随机推荐