2011-01-14 22 views
32

我已经实现了简单的TCP服务器和TCP客户端类,它们可以将消息从客户端发送到服务器,并且消息将在服务器端转换为大写,但我如何实现从服务器到客户端的传输文件并将文件从客户端上传到服务器。下面的代码是我得到的。如何实现使用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"); 
    } 
} 

}

所以,TCPServer.java将首先执行,然后执行TCPClien t.java,我尝试使用TCPServer.java中的if子句来测试用户的输入,现在我真的想实现如何从两面传输文件(下载和上传)。谢谢。

+0

完整的示例在这里https://github.com/hardeepvicky/Java-FileTransfer – 2017-09-15 07:03:35

回答

24

通过源代码快速阅读,似乎你并不遥远。下面的链接应该有所帮助(我做了类似的事情,但为了FTP)。对于从服务器发送到客户端的文件,首先使用文件实例和字节数组。然后,将文件读入字节数组,并将字节数组写入到与客户端的InputStream对应的OutputStream中。

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

编辑:这里有一个工作超简约的文件发送者和接收者。确保你了解代码在双方中的作用。

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

相关

Byte array of unknown length in java

编辑:可以在使用前和转移后的指纹小文件下面的(使用SHA如果你觉得这是必要的):

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:我已经更新了我的代码,但是,它无法正确接收文件,下载的文件是空的,您可以花些时间请检查出来。 – starcaller 2011-01-14 04:06:29

相关问题