如何使用java套接字实现客户端和服务器之间的传输文件
我已经实现了简单的TCP服务器和TCP客户端类,可以将消息从客户端发送到服务器,消息将在服务器端转换为大写,但是如何实现从服务器到客户端的传输文件并从客户端上传文件到服务器。 以下代码是我得到的。
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会先执行,然后执行TCPClient.java,我尝试使用TCPServer.java中的if子句来testing用户的input,现在我真的想实现如何从双方(下载和上传)。谢谢。
通过源头快速阅读,似乎你并不遥远。 以下链接应该帮助(我做了类似的,但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 } } } }
有关
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; } }