⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasocket.java

📁 基本设计思路: 协同编辑开始
💻 JAVA
字号:
package clienttext;

import java.io.*;
import java.net.*;
import java.util.Vector;

/**
 *
 * <p>实现从socket从本地传送和接受文件到本地 </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class DataSocket {

  private InputStream inputStream;
  private OutputStream outputStream;

  public DataSocket(Socket socket) throws IOException {
    this.inputStream = socket.getInputStream();
    this.outputStream = socket.getOutputStream();
  }

  /***********************************************
   * <p>将文件发送到socket中</p>
   ***********************************************/
  public void sendFileTo(File file) {
    try {
      ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);
      byte[] dataFromFile = getBytesFromFile(file); //从文件读取到的数据放到另一个字节数组里
      objectOutput.writeObject(dataFromFile); //将文件内容写入对象输出流
      objectOutput.flush();
      outputStream.close();
    }
    catch (IOException e) {
      System.out.print(e);
    }

  }

  /****************************************************************************
   * <p>从socket中接受文件并存储到本地 </p>
   *****************************************************************************/
  public void receiveFileAndSaveTo(File file) {
    try {
      ObjectInputStream inputFromServer = new ObjectInputStream(inputStream); //获取输入流
      byte[] fileData = (byte[]) inputFromServer.readObject(); //从输入流读取对象到字节数组
      FileOutputStream fileOut = new FileOutputStream("file", false); //该文件不可追加
      DataOutputStream outputToFile = new DataOutputStream(fileOut); //新建一个写入文件的输出流
      outputToFile.write(fileData); //将fileData字节数组中的数据写到新创建的文件中
      outputToFile.close();
    }
    catch (IOException e) {
      System.out.print(e);
    }
    catch (ClassNotFoundException ee) {
      System.out.print(ee);
    }
  }

  /****************************************************************************
    * <p>将多个文件发送到socket中 </p>
    *****************************************************************************/
  public void sendFilesTo(Vector v) {
      try {
        Vector saveTheData=new Vector();
        ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);
        //将v中的每个文件转换成相应的字节数组加入到Vector saveTheData中
        for(int i=0;i<v.size();i++)
        {
          saveTheData.add(getBytesFromFile((File) v.get(i)));
        }
        objectOutput.writeObject(saveTheData);
        objectOutput.flush();
        outputStream.close();
      }
      catch (IOException e) {
        System.out.print(e);
      }

    }

    /****************************************************************************
     * <p>接受多个文件并存储到本地</p>
     *****************************************************************************/
    public void receiveFilesAndSaveTo(Vector v) {
      int i = 0;
      try {
        ObjectInputStream inputFromServer = new ObjectInputStream(inputStream);
        Vector fileData = (Vector) inputFromServer.readObject();
        try {
          for (i = 0; i < fileData.size(); i++) {
            byte[] byteArray = (byte[]) fileData.get(i);
            FileOutputStream fileOut = new FileOutputStream(v.get(i).toString(), false);
            DataOutputStream outputToFile = new DataOutputStream(fileOut);
            outputToFile.write(byteArray);
          }
        }
        //数组越界表示预计要收的文件比实际要收到的文件少
        catch (ArrayIndexOutOfBoundsException e) {
          System.out.println("miss file" + v.get(i).toString());
        }
        //如果实际收到的文件比预计的少
        if (i < v.size()) {
          System.out.print("only  ");
          for (int j = 0; j < i; j++)
            System.out.print(v.get(j).toString() + ",");
          System.out.print(" received successful");
        }
        //outputToFile.close();
      }
      catch (IOException e) {
        System.out.print(e);
      }
      catch (ClassNotFoundException ee) {
        System.out.print(ee);
      }
      finally {

      }
    }

  /*****************************************************************************
   *把本地文件内容读到一个字节数组中
   *****************************************************************************/
  public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    long length = file.length();
    if (length > Integer.MAX_VALUE) {
      System.out.println("This file is too large");
    }
    byte[] bytes = new byte[ (int) length];
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length &&
           (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
      offset += numRead;
    }
    if (offset < bytes.length) {
      throw new IOException("could not completely read file" + file.getName());
    }
    is.close();
    return bytes;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -