实验过程
关于TCP协议的Socket和ServerSocket类的相关内容已经在前面实验5-1和实验5-2介绍完毕,此处不作赘述。
1 代码描述
首先,对于服务器端可编写代码如下,如代码 1先引入必要的包:
代码 1 服务端引入必要的包
然后定义如代码 2的文件服务类,包含连接客户端的socket,服务端的server_socket,端口port,文件路径file_path,以及字节流大小buffersize五个成员变量以及用于获取文件列表的getFileList方法,创建连接的getConnect方法和用于执行的run方法。
代码 2 服务端定义文件服务类
对于代码 3中的getFileList方法,先输出提示语,并利用工作目录创建文件获取文件列表,遍历文件列表进行判断,仅输出是文件的目录,如果是路径则不进行输出。并用Scanner获取输入以获得要进行传输的文件的名字。
代码 3 服务端getFileList方法
对于代码 4中的getConnect方法,利用代码 3中的getFileList方法获取的文件名读对应的文件。在接受客户端的Socket后,使用重定向的字符流将文件的名字和文件内容通过socket传给客户端。完成传输后清空缓冲区并关闭socket。
代码 4 服务端getConnect方法
对于代码 5中的run方法,依次执行代码 3中的getFileList方法和代码 4中的getConnect方法即可。
代码 5 服务端的run方法
对于客户端,也要引入如代码 6的库:
代码 6 客户端的库
定义如代码 7的客户端文件类,包含连接客户端的client_socket,IP,端口port,文件保存路径save_path,以及字节流大小buffersize五个成员变量以及用于创建连接的getConnect方法。
代码 7 客户端定义文件类
对于如的getConnect方法,通过ip和port创建socket后借助buffer流,获取服务端的文件流,并借助重定向将文件保存下来。
代码 8 客户端getConnect方法
2 测试运行
首先,运行服务端。将显示如图 1的文件列表。
图 1 文件列表
在此以传输test.txt为例,输入test.txt。结果如图 2
图 2 选择test.txt进行测试
紧接着,客户端开始建立连接,获取文件并自动重命名如图 3
图 3 客户端建立连接并获取文件
完成传输后,服务端也给出如图 4的提示。
图 4 服务端完成传输
最后检验一下传输的结果,如图 5,可以看到传输成功。
图 5 传输结果
【附件】
Client.java
import java.io.*; import java.net.*; public class File_client { private Socket Client_Socket; //Create the client socket private String ip = "localhost"; //Create the string of IP which has the default value set to "localhost" private int buffersize = 1024; private int port = 6574; private String save_path; //Create the string of save path private void getConnect() { try { Client_Socket = new Socket(ip, port); //Try to connect to the server socket System.out.println("Connection is built."); DataInputStream in = new DataInputStream(Client_Socket.getInputStream()); String get_path = in.readUTF(); save_path = "./received_" + get_path; DataOutputStream out = new DataOutputStream(Client_Socket.getOutputStream()); DataOutputStream file_out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(save_path))); //Try to read the content from the server System.out.println("Receiving " + get_path); System.out.println("Saving in " + save_path); byte[] buffer = new byte[buffersize]; //Use buffer to store the data int length = 0; while ((length = in.read(buffer, 0, buffer.length)) > 0) { file_out.write(buffer, 0, length); //Write out the data file_out.flush(); } System.out.println("Finished " + save_path); file_out.close(); } catch (Exception e) { System.out.println("Error:" + e); } } public static void main(String[] args) { new File_client().getConnect(); } }
Server.java
import java.io.*; import java.net.*; import java.util.Scanner; public class File_server { private Socket socket; //Create the socket to connect to the client private ServerSocket server_socket; //Create the server socket private int port = 6574; private String file_path; //the path of the file private int buffersize = 1024; void getFileList() throws IOException { System.out.println("Choose your file to transfer!"); System.out.println("===================================="); File file = new File(new File("").getCanonicalPath()); File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { System.out.println(f.getName()); } } Scanner scanner = new Scanner(System.in); file_path = scanner.next(); } void getConnect() { try { server_socket = new ServerSocket(port); //Set server socket using the same port File file = new File(file_path); System.out.println("============Server is on============"); socket = server_socket.accept(); //Try to connect to the client System.out.println("============Connection is built============"); DataInputStream in = new DataInputStream(socket.getInputStream()); DataInputStream file_in = new DataInputStream(new BufferedInputStream(new FileInputStream(file_path))); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.println("Sending file: " + file_path); out.writeUTF(file.getPath()); //Write in the file path to the client out.flush(); byte[] buffer = new byte[buffersize]; int length = 0; while ((length = file_in.read(buffer, 0, buffer.length)) > 0) { out.write(buffer, 0, length); //Write in the file content to the client out.flush(); } System.out.println("Finished."); out.flush(); file_in.close(); socket.close(); server_socket.close(); } catch (IOException e) { System.out.println("Error!"); System.out.println(e); } } void run() throws IOException { getFileList(); getConnect(); } public static void main(String[] args) throws IOException { new File_server().run(); } }