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

本文实例介绍了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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, socket
文件传输
java socket文件传输、java socket传输图片、java socket传输对象、java socket 视频传输、java socket传输byte,以便于您获取更多的相关知识。

时间: 2024-10-30 04:00:52

浅析Java基于Socket的文件传输案例_java的相关文章

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

本文实例讲述了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的TCP传输实例_java

本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutputSt

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream;

java基于Socket做一个简单下载器_java

本文实例为大家分享了java基于Socket制作下载器的过程,及相关代码,供大家参考,具体内容如下 1.首先要建立一个服务器用来处理信息并给客户端传输文件(电脑)  我是用电脑开了一个WIFI,手机连上后使用scoket传输的  SERVERIP要根据自己实际情况更改.端口也可以随便更改0~65535,尽量选大一点  import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Bu

Java基于socket服务实现UDP协议的方法

  本文实例讲述了Java基于socket服务实现UDP协议的方法.分享给大家供大家参考.具体如下: 示例1: 接收类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net

Java IO流 文件传输基础_java

一.文件的编码 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();//这是把字符串转换成字符数组,转换成的字节序列用的是

Java基于socket服务实现UDP协议的方法_java

本文实例讲述了Java基于socket服务实现UDP协议的方法.分享给大家供大家参考.具体如下: 示例1: 接收类: package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPReceiveDemo { public static void main(String[] args) throw

Java实现Socket的TCP传输实例

  本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutput

Java基于socket实现简易聊天室实例

  本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @thro