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

 更新时间:2016年02月10日 21:29:09   投稿:lijiao  
这篇文章主要针对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 Socket socket = null; 
 
  DataOutputStream out = null; 
 
  DataInputStream getMessageStream = null; 
 
  public ClientSocket(String ip, int port) { 
    this.ip = ip; 
    this.port = port; 
  } 
 
  /** 
   * 创建socket连接 
   * 
   * @throws Exception 
   *       exception 
   */ 
  public void CreateConnection() throws Exception { 
 
    try { 
      socket = new Socket(ip, port); 
    } catch (Exception e) { 
      e.printStackTrace(); 
      if (socket != null) 
        socket.close(); 
      throw e; 
    } finally { 
    } 
  } 
 
  // 发送消息 
  public void sendMessage(String sendMessage) throws Exception { 
    try { 
      out = new DataOutputStream(socket.getOutputStream()); 
      if (sendMessage.equals("Windows")) { 
        out.writeByte(0x1); 
        out.flush(); 
        return; 
      } 
      if (sendMessage.equals("Unix")) { 
        out.writeByte(0x2); 
        out.flush(); 
        return; 
      } 
      if (sendMessage.equals("Linux")) { 
        out.writeByte(0x3); 
        out.flush(); 
      } else { 
        out.writeUTF(sendMessage); 
        out.flush(); 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
      if (out != null) 
        out.close(); 
      throw e; 
    } finally { 
    } 
  } 
 
  // 接受消息 
  public DataInputStream getMessageStream() throws Exception { 
    try { 
      getMessageStream = new DataInputStream(new BufferedInputStream( 
          socket.getInputStream())); 
      return getMessageStream; 
    } catch (Exception e) { 
      e.printStackTrace(); 
      if (getMessageStream != null) 
        getMessageStream.close(); 
      throw e; 
    } finally { 
    } 
  } 
 
  // 关闭连接 
  public void shutDownConnection() { 
    try { 
      if (out != null) 
        out.close(); 
      if (getMessageStream != null) 
        getMessageStream.close(); 
      if (socket != null) 
        socket.close(); 
    } catch (Exception e) { 
    } 
  } 
} 

2、Java代码

package com.wf.demo.socket.socketfile; 
 
import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
/** 
 * 1.服务器端 
 * 
 * @author willson 
 * 
 */ 
public class ServerTest { 
   
  int port = 8821; 
 
  void start() { 
     
    Socket socket = null; 
     
    try { 
       
      ServerSocket serverSocket = new ServerSocket(port); 
       
      while (true) { 
        // 选择进行传输的文件 
        String filePath = "E:\\lib.zip"; 
         
        File fi = new File(filePath); 
 
        System.out.println("File Name:" + fi.getName() + ";\tFile Size():" + (int) fi.length() + "bytes"); 
 
        // public Socket accept() throws 
        // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。 
 
         
        System.out.println("等待客户端连接,连接端口:" + port); 
        socket = serverSocket.accept(); 
         
        System.out.println("建立socket链接"); 
         
        DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
         
        dis.readByte(); 
 
        DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); 
         
        DataOutputStream ps = new DataOutputStream(socket.getOutputStream()); 
         
        // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 
        // 4th里有现成的代码。 
        ps.writeUTF(fi.getName()); 
        ps.flush(); 
        ps.writeLong((long) fi.length()); 
        ps.flush(); 
 
        int bufferSize = 8192; 
        byte[] buf = new byte[bufferSize]; 
 
        while (true) { 
           
          int read = 0; 
          if (fis != null) { 
            read = fis.read(buf); 
          } 
 
          if (read == -1) { 
            break; 
          } 
          ps.write(buf, 0, read); 
        } 
         
        ps.flush(); 
        // 注意关闭socket链接哦,不然客户端会等待server的数据过来, 
        // 直到socket超时,导致数据不完整。 
        fis.close(); 
        socket.close(); 
         
        System.out.println("文件传输完成\n"); 
      } 
 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
 
  public static void main(String arg[]) { 
    new ServerTest().start(); 
  } 
} 
 
 


3、客户端

package com.wf.demo.socket.socketfile; 
 
import java.io.BufferedOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.FileOutputStream; 
 
/** 
 * 3.客户端 
 * 
 * @author willson 
 * 
 */ 
public class ClientTest { 
 
  private ClientSocket cs = null; 
 
  private String ip = "localhost";// 设置成服务器IP 
 
  private int port = 8821; 
 
  private String sendMessage = "Windwos"; 
 
  public ClientTest() { 
 
    try { 
      if (createConnection()) { 
        sendMessage(); 
        getMessage("F:\\"); 
      } 
    } catch (Exception ex) { 
      ex.printStackTrace(); 
    } 
  } 
 
  private boolean createConnection() { 
     
    cs = new ClientSocket(ip, port); 
    try { 
      cs.CreateConnection(); 
      System.out.print("连接服务器成功!" + "\n"); 
      return true; 
    } catch (Exception e) { 
      System.out.print("连接服务器失败!" + "\n"); 
      return false; 
    } 
 
  } 
 
  private void sendMessage() { 
     
    if (cs == null) 
      return; 
    try { 
      cs.sendMessage(sendMessage); 
    } catch (Exception e) { 
      System.out.print("发送消息失败!" + "\n"); 
    } 
  } 
 
  private void getMessage(String savePath) { 
     
    if (cs == null) 
      return; 
    DataInputStream inputStream = null; 
    try { 
      inputStream = cs.getMessageStream(); 
    } catch (Exception e) { 
      System.out.print("接收消息缓存错误\n"); 
      return; 
    } 
 
    try { 
       
      // 本地保存路径,文件名会自动从服务器端继承而来。 
      int bufferSize = 8192; 
      byte[] buf = new byte[bufferSize]; 
      int passedlen = 0; 
      long len = 0; 
 
      savePath += inputStream.readUTF(); 
      DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)))); 
      len = inputStream.readLong(); 
 
      System.out.println("File Size():" + len + "bytes"); 
      System.out.println("开始接收文件!" + "\n"); 
 
      while (true) { 
         
        int read = 0; 
        if (inputStream != null) { 
          read = inputStream.read(buf); 
        } 
        passedlen += read; 
        if (read == -1) { 
          break; 
        } 
        // 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比 
        System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n"); 
        fileOut.write(buf, 0, read); 
      } 
      System.out.println("接收完成,文件存为" + savePath + "\n"); 
 
      fileOut.close(); 
    } catch (Exception e) { 
      System.out.println("接收消息错误" + "\n"); 
      return; 
    } 
  } 
 
  public static void main(String arg[]) { 
    new ClientTest(); 
  } 
} 

希望本文所述对大家学习java程序设计有所帮助。

相关文章

  • JDBC示例代码

    JDBC示例代码

    本教程提供了如何创建一个简单的JDBC应用程序的示例。演示如何打开一个数据库连接,执行SQL查询,并显示结果
    2014-03-03
  • SpringBoot AOP @Pointcut切入点表达式排除某些类方式

    SpringBoot AOP @Pointcut切入点表达式排除某些类方式

    这篇文章主要介绍了SpringBoot AOP @Pointcut切入点表达式排除某些类方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Netty中的DelimiterBasedFrameDecoder使用方法详解

    Netty中的DelimiterBasedFrameDecoder使用方法详解

    这篇文章主要介绍了Netty中的DelimiterBasedFrameDecoder使用方法详解,DelimiterBasedFrameDecoder与LineBasedFrameDecoder类似,只不过更加通用,允许我们指定任意特殊字符作为分隔符,我们还可以同时指定多个分隔符,需要的朋友可以参考下
    2023-12-12
  • 详细聊一聊java中封装的那点事

    详细聊一聊java中封装的那点事

    封装是一个非常广泛的概念,小到一个属性的封装,大到一个框架或者一个项目的封装,下面这篇文章主要给大家介绍了关于java中封装的那点事,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • SpringBoot+Spring Security无法实现跨域的解决方案

    SpringBoot+Spring Security无法实现跨域的解决方案

    这篇文章主要介绍了SpringBoot+Spring Security无法实现跨域的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MyBatis使用注解开发和无主配置文件开发的情况

    MyBatis使用注解开发和无主配置文件开发的情况

    这篇文章主要介绍了MyBatis使用注解开发和无主配置文件开发的情况,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • spring通过filter,Interceptor统一处理ResponseBody的返回值操作

    spring通过filter,Interceptor统一处理ResponseBody的返回值操作

    这篇文章主要介绍了spring通过filter,Interceptor统一处理ResponseBody的返回值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java wait()/notify() 实现生产者消费者模式详解

    java wait()/notify() 实现生产者消费者模式详解

    这篇文章主要介绍了java wait()/notify() 实现生产者消费者模式详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 浅谈SpringBoot实现自动装配的方法原理

    浅谈SpringBoot实现自动装配的方法原理

    SpringBoot的自动装配是它的一大特点,可以大大提高开发效率,减少重复性代码的编写。本文将详细讲解SpringBoot如何实现自动装配,需要的朋友可以参考下
    2023-05-05
  • java反射如何获取方法属性和方法调用

    java反射如何获取方法属性和方法调用

    这篇文章主要介绍了java反射如何获取方法属性和方法调用问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论