Java file transfer method based on Socket

  • 2020-04-01 04:29:31
  • OfStack

This article illustrates the Java file transfer method based on Socket. Share with you for your reference, as follows:

1. The Java code is as follows:


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.ServerSocket;
import java.net.Socket;
public class ServerTest {
 int port = 8821;
 void start() {
  Socket s = null;
  try {
   ServerSocket ss = new ServerSocket(port);
   while (true) {
    //Select the file for transfer
    String filePath = "D:\lib.rar";
    File fi = new File(filePath);
    System.out.println(" The length of the file :" + (int) fi.length());
    // public Socket accept() throws
    //IOException listens for and accepts a connection to this socket. This method blocks until the connection is made.
    s = ss.accept();
    System.out.println(" To establish socket link ");
    DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
    dis.readByte();
    DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
    DataOutputStream ps = new DataOutputStream(s.getOutputStream());
    //Pass the file name and length to the client. Here to really apply to all platforms, such as Chinese name processing, still need to process, specific can see Think In Java 4th has ready-made code.
    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();
    //Close the socket connection, or the client will wait for the server's data.
    //Until the socket timeout, resulting in incomplete data.
    fis.close();
    s.close();    
    System.out.println(" File transfer completed ");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static void main(String arg[]) {
  new ServerTest().start();
 }
}

2. Socket Util helper class


package sterning;
import java.net.*;
import java.io.*;
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;
 }
 
 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) {
  }
 }
}

3. The client


package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ClientTest {
 private ClientSocket cs = null;
 private String ip = "localhost";//Set to server IP
 private int port = 8821;
 private String sendMessage = "Windwos";
 public ClientTest() {
  try {
   if (createConnection()) {
    sendMessage();
    getMessage();
   }
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 private boolean createConnection() {
  cs = new ClientSocket(ip, port);
  try {
   cs.CreateConnection();
   System.out.print(" Server connection successful !" + "n");
   return true;
  } catch (Exception e) {
   System.out.print(" Connection to server failed !" + "n");
   return false;
  }
 }
 private void sendMessage() {
  if (cs == null)
   return;
  try {
   cs.sendMessage(sendMessage);
  } catch (Exception e) {
   System.out.print(" Failed to send message !" + "n");
  }
 }
 private void getMessage() {
  if (cs == null)
   return;
  DataInputStream inputStream = null;
  try {
   inputStream = cs.getMessageStream();
  } catch (Exception e) {
   System.out.print(" Received message cache error n");
   return;
  }
  try {
   //Save the path locally and the file name is automatically inherited from the server.
   String savePath = "E:\";
   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(" The length of the file is :" + len + "n");
   System.out.println(" Start receiving files !" + "n");
   while (true) {
    int read = 0;
    if (inputStream != null) {
     read = inputStream.read(buf);
    }
    passedlen += read;
    if (read == -1) {
     break;
    }
    //The following progress bar was made in prograssBar for the graphical interface, where if you were typing a file, you might print out some of the same percentages over and over again
    System.out.println(" File received " + (passedlen * 100/ len) + "%n");
    fileOut.write(buf, 0, read);
   }
   System.out.println(" Receive completed, file saved as " + savePath + "n");
   fileOut.close();
  } catch (Exception e) {
   System.out.println(" Receiving message error " + "n");
   return;
  }
 }
 public static void main(String arg[]) {
  new ClientTest();
 }
}

I hope this article has been helpful to you in Java programming.


Related articles: