java实现客户端向服务器发送文件

本文实例为大家分享了java实现客户端向服务器发送文件的具体代码,供大家参考,具体内容如下

服务器源代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; 

/**
 *
 * 文件名:ServerReceive.java
 * 实现功能:作为服务器接收客户端发送的文件
 *
 * 具体实现过程:
 * 1、建立SocketServer,等待客户端的连接
 * 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据
 *   其中保存客户端要发送的文件名和文件大小信息
 * 3、根据文件名在本地创建文件,并建立好流通信
 * 4、循环接收数据包,将数据包写入文件
 * 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件
 * 6、文件接收工作结束
 *
 *
 * 【注:此代码仅为演示客户端与服务器传送文件使用,
 *   每一个数据包之前没有文件协议命令
 *   具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】
 *
 *
 * 作者:小菜鸟
 * 创建时间:2014-08-19
 *
 * */ 

public class ServerReceive { 

  public static void main(String[] args) { 

    /**与服务器建立连接的通信句柄*/
    ServerSocket ss = null;
    Socket s = null; 

    /**定义用于在接收后在本地创建的文件对象和文件输出流对象*/
    File file = null;
    FileOutputStream fos = null; 

    /**定义输入流,使用socket的inputStream对数据包进行输入*/
    InputStream is = null; 

    /**定义byte数组来作为数据包的存储数据包*/
    byte[] buffer = new byte[4096 * 5]; 

    /**用来接收文件发送请求的字符串*/
    String comm = null; 

    /**建立socekt通信,等待服务器进行连接*/
    try {
      ss = new ServerSocket(4004);
      s = ss.accept();
    } catch (IOException e) {
      e.printStackTrace();
    } 

    /**读取一行客户端发送过来的约定信息*/
    try {
      InputStreamReader isr = new InputStreamReader(s.getInputStream());
      BufferedReader br = new BufferedReader(isr);
      comm = br.readLine();
    } catch (IOException e) {
      System.out.println("服务器与客户端断开连接");
    } 

    /**开始解析客户端发送过来的请求命令*/
    int index = comm.indexOf("/#"); 

    /**判断协议是否为发送文件的协议*/
    String xieyi = comm.substring(0, index);
    if(!xieyi.equals("111")){
      System.out.println("服务器收到的协议码不正确");
      return;
    } 

    /**解析出文件的名字和大小*/
    comm = comm.substring(index + 2);
    index = comm.indexOf("/#");
    String filename = comm.substring(0, index).trim();
    String filesize = comm.substring(index + 2).trim(); 

    /**创建空文件,用来进行接收文件*/
    file = new File(filename);
    if(!file.exists()){
      try {
        file.createNewFile();
      } catch (IOException e) {
        System.out.println("服务器端创建文件失败");
      }
    }else{
      /**在此也可以询问是否覆盖*/
      System.out.println("本路径已存在相同文件,进行覆盖");
    } 

    /**【以上就是客户端代码中写到的服务器的准备部分】*/ 

    /**
     * 服务器接收文件的关键代码*/
    try {
      /**将文件包装到文件输出流对象中*/
      fos = new FileOutputStream(file);
      long file_size = Long.parseLong(filesize);
      is = s.getInputStream();
      /**size为每次接收数据包的长度*/
      int size = 0;
      /**count用来记录已接收到文件的长度*/
      long count = 0; 

      /**使用while循环接收数据包*/
      while(count < file_size){
        /**从输入流中读取一个数据包*/
        size = is.read(buffer); 

        /**将刚刚读取的数据包写到本地文件中去*/
        fos.write(buffer, 0, size);
        fos.flush(); 

        /**将已接收到文件的长度+size*/
        count += size;
        System.out.println("服务器端接收到数据包,大小为" + size);
      } 

    } catch (FileNotFoundException e) {
      System.out.println("服务器写文件失败");
    } catch (IOException e) {
      System.out.println("服务器:客户端断开连接");
    }finally{
      /**
       * 将打开的文件关闭
       * 如有需要,也可以在此关闭socket连接
       * */
      try {
        if(fos != null)
          fos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }//catch (IOException e)
    }//finally 

  }//public static void main(String[] args)
}//public class ServerReceive 

客户端源代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket; 

/**
 *
 * 文件名:ClientSend.java
 * 实现功能:作为客户端向服务器发送一个文件
 *
 * 具体实现过程:
 * 1、建立与服务器端的连接,IP:127.0.0.1, port:4004
 * 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器
 * 3、循环读取本地文件,将文件打包发送到数据输出流中
 * 4、关闭文件,结束传输
 *
 * 【注:此代码仅为演示客户端与服务器传送文件使用,
 *   每一个数据包之前没有文件协议命令
 *   具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】
 *
 *
 * 作者:小菜鸟
 * 创建时间:2014-08-19
 *
 * */ 

public class ClientSend { 

  public static void main(String[] args) { 

    /**与服务器建立连接的通信句柄*/
    Socket s = null; 

    /**定义文件对象,即为要发送的文件
     * 如果使用绝对路径,不要忘记使用'/'和'\'的区别
     * 具体区别,请读者自行查询
     * */
    File sendfile = new File("API.CHM");
    /**定义文件输入流,用来打开、读取即将要发送的文件*/
    FileInputStream fis = null;
    /**定义byte数组来作为数据包的存储数据包*/
    byte[] buffer = new byte[4096 * 5]; 

    /**定义输出流,使用socket的outputStream对数据包进行输出*/
    OutputStream os = null; 

    /**检查要发送的文件是否存在*/
    if(!sendfile.exists()){
      System.out.println("客户端:要发送的文件不存在");
      return;
    } 

    /**与服务器建立连接*/
    try {
      s = new Socket("127.0.0.1", 4004);
    }catch (IOException e) {
      System.out.println("未连接到服务器");
    } 

    /**用文件对象初始化fis对象
     * 以便于可以提取出文件的大小
     * */
    try {
      fis = new FileInputStream(sendfile);
    } catch (FileNotFoundException e1) {
      e1.printStackTrace();
    } 

    /**首先先向服务器发送关于文件的信息,以便于服务器进行接收的相关准备工作
     * 具体的准备工作,请查看服务器代码。
     *
     * 发送的内容包括:发送文件协议码(此处为111)/#文件名(带后缀名)/#文件大小
     * */
    try {
      PrintStream ps = new PrintStream(s.getOutputStream());
      ps.println("111/#" + sendfile.getName() + "/#" + fis.available());
      ps.flush();
    } catch (IOException e) {
      System.out.println("服务器连接中断");
    } 

    /**
     * 此处睡眠2s,等待服务器把相关的工作准备好
     * 也是为了保证网络的延迟
     * 读者可自行选择添加此代码
     * */
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e1) {
      e1.printStackTrace();
    } 

    /**之前的准备工作结束之后
     * 下面就是文件传输的关键代码
     * */
    try { 

      /**获取socket的OutputStream,以便向其中写入数据包*/
      os = s.getOutputStream(); 

      /** size 用来记录每次读取文件的大小*/
      int size = 0; 

      /**使用while循环读取文件,直到文件读取结束*/
      while((size = fis.read(buffer)) != -1){
        System.out.println("客户端发送数据包,大小为" + size);
        /**向输出流中写入刚刚读到的数据包*/
        os.write(buffer, 0, size);
        /**刷新一下*/
        os.flush();
      }
    } catch (FileNotFoundException e) {
      System.out.println("客户端读取文件出错");
    } catch (IOException e) {
      System.out.println("客户端输出文件出错");
    }finally{ 

      /**
       * 将打开的文件关闭
       * 如有需要,也可以在此关闭socket连接
       * */
      try {
        if(fis != null)
          fis.close();
      } catch (IOException e) {
        System.out.println("客户端文件关闭出错");
      }//catch (IOException e)
    }//finally 

  }//public static void main(String[] args)
}//public class ClientSend 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Java实现文件上传服务器和客户端
  • java实现多文件上传至本地服务器功能
  • Java实现文件上传至服务器的方法
  • Java实现跨服务器上传文件功能
  • java文件上传至ftp服务器的方法
  • java实现上传文件到服务器和客户端
  • Java上传文件到服务器端的方法
  • Java上传文件图片到服务器的方法
  • 基于HTML5+js+Java实现单文件文件上传到服务器功能
  • Java实现图片上传到服务器并把上传的图片读取出来
(0)

相关推荐

  • Java上传文件图片到服务器的方法

    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 <div style="border: 1px solid red;"> 我是添加一张临时图片得到微信的media_id保存数据库! <form action="xxxxxxxxm" enctype="multipart/form-data" method="post">

  • java文件上传至ftp服务器的方法

    用java实现ftp文件上传.我使用的是commons-net-1.4.1.zip.其中包含了众多的java网络编程的工具包. 1.把commons-net-1.4.1.jar包加载到项目工程中去. 2.看如下代码: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ft

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • Java上传文件到服务器端的方法

    Web文件上传采用POST的方式,与POST提交表单不同的是,上传文件需要设置FORM的enctype属性为multipart/form-data.由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传.如果不设置,enctype属性默认为application/x-www-form-urlencoded,使用浏览器将使用ASCII向服务器发送数据,导致发送文件失败. 上传文件要使用文件域(<input type='file'/>,并把FORM的Enctype设置为multipar

  • 基于HTML5+js+Java实现单文件文件上传到服务器功能

    上传单文件到服务器       应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,网上各种百度,找各种博客还是没解决,最后还是请教了公司的大神,人家给卸了一个例子,然后根据人家写的终于把这个上传文件搞定. 好了,开始上代码. HTML5代码: <form name="upform" action="" method="POST"> <input type ="

  • Java实现文件上传服务器和客户端

    本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下 文件上传服务器端: /** * 使用TCP协议实现上传功能的服务器端 * 思路: * 新建ServerSocket * 等待客户端连接 * 连接上后开启子线程,把连接获取的Socket传给子线程 * 循环进行 * @author yajun * */ public class UploadServer { public static void main(String[] args) { UploadSer

  • Java实现文件上传至服务器的方法

    在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去. 如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些图片,文档上传到服务器上面去.然后其他用户可以去下载这些文件,那么这样的话,我们可以自己编程实现文件的上传 但是更好的方式是使用一些已有的组件帮助我们实现这种上传功能. 常用的上传组件: Apache 的 Commons FileUpload JavaZoom的UploadBean jspSmartUpload upload.jsp 代码: <%@ pag

  • Java实现跨服务器上传文件功能

    前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的.老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了.显然,把大到几百M的apk文件存到数据库不现实,查了半天,在两端建立ftp服务器传文件是最快的方法. 具体流程是,用户登录外网客户端,上传文件到外网的服务器硬盘上,在此同时,文件通过外网服务器访问内网管理员服务器的ftp服务器,传到内网服务器的硬盘上.这样内网服务器可以对上传的文件进行加密签名工作,之后也通过ftp的方

  • java实现上传文件到服务器和客户端

    JAVA编写一个可以上传文件的服务器和客户端,具体内容如下 服务端 class Server { public static void main(String[] args) throws Exception { //建立服务端Socket ServerSocket ss = new ServerSocket(10005); //接收客户端Socket Socket fileLoaderSocket = ss.accept(); //打印连接信息 String ip = fileLoaderSo

  • java实现多文件上传至本地服务器功能

    博主最近在做一个内网项目,内部可以访问外部数据,但是外部访问不了内部数据,这也就造成了可能文件无法上传,所以博主另辟蹊径,在本地服务器上建立一个文件夹专门用来存储上传数据. 环境:jdk,tomcat 一.前台上传文件(ajax上传) <input type="file" name="annexUrl" id="annexUrl" multiple="multiple"/> 其中multiple="mul

随机推荐