cómo lograr transferir el archivo entre el cliente y el servidor usando el socket java

Implementé el servidor TCP simple y las clases de cliente TCP que pueden enviar el mensaje de cliente a servidor y el mensaje se convertirá en mayúsculas en el lado del servidor, pero ¿cómo puedo lograr transferir archivos de servidor a cliente y cargar archivos desde el cliente? al servidor. los siguientes códigos son los que tengo.

TCPClient.java

import java.io.*; import java.net.*; import java.util.Scanner; class TCPClient { public static void main(String args[]) throws Exception { int filesize=6022386; int bytesRead; int current = 0; String ipAdd=""; int portNum=0; boolean goes=false; if(goes==false){ System.out.println("please input the ip address of the file server"); Scanner scan=new Scanner(System.in); ipAdd=scan.nextLine(); System.out.println("please input the port number of the file server"); Scanner scan1=new Scanner(System.in); portNum=scan1.nextInt(); goes=true; } System.out.println("input done"); int timeCount=1; while(goes==true){ //System.out.println("connection establishing"); String sentence=""; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader( System.in)); Socket clientSocket = new Socket(ipAdd, portNum); //System.out.println("connecting"); //System.out.println(timeCount); if(timeCount==1){ sentence="set"; //System.out.println(sentence); } if(timeCount!=1) sentence = inFromUser.readLine(); if(sentence.equals("close")) clientSocket.close(); if(sentence.equals("download")) { byte [] mybytearray = new byte [filesize]; InputStream is = clientSocket.getInputStream(); FileOutputStream fos = new FileOutputStream("C:\\users\\cguo\\kk.lsp"); BufferedOutputStream bos = new BufferedOutputStream(fos); bytesRead = is.read(mybytearray,0,mybytearray.length); current = bytesRead; do { bytesRead = is.read(mybytearray, current, (mybytearray.length-current)); if(bytesRead >= 0) current += bytesRead; } while(bytesRead > -1); bos.write(mybytearray, 0 , current); bos.flush(); long end = System.currentTimeMillis(); //System.out.println(end-start); bos.close(); clientSocket.close(); } // if(sentence.equals("send")) // clientSocket. timeCount--; //System.out.println("connecting1"); DataOutputStream outToServer = new DataOutputStream(clientSocket .getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); //System.out.println("connecting2"); //System.out.println(sentence); outToServer.writeBytes(sentence + "\n"); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } 

}


TCPServer.java

  import java.io.*; import java.net.*; class TCPServer { public static void main(String args[]) throws Exception { Socket s = null; int firsttime=1; while (true) { String clientSentence; String capitalizedSentence=""; ServerSocket welcomeSocket = new ServerSocket(3248); Socket connectionSocket = welcomeSocket.accept(); //Socket sock = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); //System.out.println(clientSentence); if(clientSentence.equals("download")) { File myFile = new File ("C:\\Users\\cguo\\11.lsp"); byte [] mybytearray = new byte [(int)myFile.length()]; FileInputStream fis = new FileInputStream(myFile); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(mybytearray,0,mybytearray.length); OutputStream os = connectionSocket.getOutputStream(); System.out.println("Sending..."); os.write(mybytearray,0,mybytearray.length); os.flush(); connectionSocket.close(); } if(clientSentence.equals("set")) {outToClient.writeBytes("connection is "); System.out.println("running here"); //welcomeSocket.close(); //outToClient.writeBytes(capitalizedSentence); } capitalizedSentence = clientSentence.toUpperCase() + "\n"; //if(!clientSentence.equals("quit")) outToClient.writeBytes(capitalizedSentence+"enter the message or command: "); System.out.println("passed"); //outToClient.writeBytes("enter the message or command: "); welcomeSocket.close(); System.out.println("connection terminated"); } } 

}

Entonces, el TCPServer.java se ejecutará primero, y luego ejecutará el TCPClient.java, e intentaré usar la cláusula if en el TCPServer.java para probar la entrada del usuario, ahora realmente quiero implementar cómo transferir archivos de ambos lados (descargar y subir) .Gracias.

    Al leer rápidamente la fuente, parece que no estás lejos. El siguiente enlace debería ayudar (hice algo similar, pero para FTP). Para enviar un archivo de un servidor a otro, comienza con una instancia de archivo y una matriz de bytes. A continuación, lee el archivo en la matriz de bytes y escribe la matriz de bytes en el flujo de salida que corresponde con el InputStream en el lado del cliente.

    http://www.rgagnon.com/javadetails/java-0542.html

    Editar: Aquí hay un remitente y un receptor de archivos ultra minimalista. Asegúrese de entender lo que el código está haciendo en ambos lados.

     package filesendtest; import java.io.*; import java.net.*; class TCPServer { private final static String fileToSend = "C:\\test1.pdf"; public static void main(String args[]) { while (true) { ServerSocket welcomeSocket = null; Socket connectionSocket = null; BufferedOutputStream outToClient = null; try { welcomeSocket = new ServerSocket(3248); connectionSocket = welcomeSocket.accept(); outToClient = new BufferedOutputStream(connectionSocket.getOutputStream()); } catch (IOException ex) { // Do exception handling } if (outToClient != null) { File myFile = new File( fileToSend ); byte[] mybytearray = new byte[(int) myFile.length()]; FileInputStream fis = null; try { fis = new FileInputStream(myFile); } catch (FileNotFoundException ex) { // Do exception handling } BufferedInputStream bis = new BufferedInputStream(fis); try { bis.read(mybytearray, 0, mybytearray.length); outToClient.write(mybytearray, 0, mybytearray.length); outToClient.flush(); outToClient.close(); connectionSocket.close(); // File sent, exit the main method return; } catch (IOException ex) { // Do exception handling } } } } } 

     package filesendtest; import java.io.*; import java.io.ByteArrayOutputStream; import java.net.*; class TCPClient { private final static String serverIP = "127.0.0.1"; private final static int serverPort = 3248; private final static String fileOutput = "C:\\testout.pdf"; public static void main(String args[]) { byte[] aByte = new byte[1]; int bytesRead; Socket clientSocket = null; InputStream is = null; try { clientSocket = new Socket( serverIP , serverPort ); is = clientSocket.getInputStream(); } catch (IOException ex) { // Do exception handling } ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (is != null) { FileOutputStream fos = null; BufferedOutputStream bos = null; try { fos = new FileOutputStream( fileOutput ); bos = new BufferedOutputStream(fos); bytesRead = is.read(aByte, 0, aByte.length); do { baos.write(aByte); bytesRead = is.read(aByte); } while (bytesRead != -1); bos.write(baos.toByteArray()); bos.flush(); bos.close(); clientSocket.close(); } catch (IOException ex) { // Do exception handling } } } } 

    Relacionado

    Conjunto de bytes de longitud desconocida en java

    Editar: Lo siguiente podría usarse para tomar huellas dactilares de archivos pequeños antes y después de la transferencia (use SHA si lo considera necesario):

     public static String md5String(File file) { try { InputStream fin = new FileInputStream(file); java.security.MessageDigest md5er = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; int read; do { read = fin.read(buffer); if (read > 0) { md5er.update(buffer, 0, read); } } while (read != -1); fin.close(); byte[] digest = md5er.digest(); if (digest == null) { return null; } String strDigest = "0x"; for (int i = 0; i < digest.length; i++) { strDigest += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1).toUpperCase(); } return strDigest; } catch (Exception e) { return null; } }