2011-01-14 9 views
32

Ho implementato il semplice server TCP e le classi client TCP che possono inviare il messaggio da client a server e il messaggio verrà convertito in maiuscolo sul lato server, ma come posso trasferire file da server a client e caricare file da client a server. i seguenti codici sono ciò che ho ottenuto.come ottenere file di trasferimento tra client e server utilizzando la presa java

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"); 
    } 
} 

}

Così, il TCPServer.java verrà eseguito prima, e poi eseguire il TCPClien t.java, e cerco di usare la clausola if in TCPServer.java per verificare quale sia l'input dell'utente, ora voglio davvero implementare come trasferire file da entrambi i lati (download e upload) .Grazie.

+0

Esempio completo è qui https://github.com/hardeepvicky/Java-FileTransfer –

risposta

24

Leggendo rapidamente attraverso la fonte, sembra che tu non sia lontano. Il seguente link dovrebbe aiutare (ho fatto qualcosa di simile, ma per FTP). Per inviare un file da un server all'altro, si inizia con un'istanza di file e una matrice di byte. Quindi leggi il file nell'array di byte e scrivi l'array di byte su OutputStream che corrisponde a InputStream sul lato del client.

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

Edit: Ecco un lavoro mittente di file ultra-minimalista e il ricevitore. Assicurati di capire cosa sta facendo il codice su entrambi i lati.

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 
      } 
     } 
    } 
} 

correlati

Byte array of unknown length in java

Edit: Il seguente potrebbe essere usato per le impronte digitali dei piccoli file prima e dopo il trasferimento (usare SHA se si sente che è necessario):

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; 
    } 
} 
+0

@James: Ho aggiornato il mio codice, tuttavia, non può ricevere il file correttamente, il file scaricato è vuoto, puoi prendere qualche volta controllalo per favore – starcaller

+0

Assicurati inoltre di chiudere 'BufferedOutputStream' (il solito colpevole quando un file è vuoto). –

+0

@James: L'ho provato ma non ha funzionato neanche. – starcaller

Problemi correlati