黑马程序员_网络编程-代码实现
程序员文章站
2022-06-14 10:12:20
...
------- android培训、java培训、期待与您交流! ----------
客户端
package cn.itcast.b_upload; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { // 1. 控制台获取用户上传的文件的路径. File file = getFile(); System.out.println(file); // 2. 创建客户端Socket. Socket socket = new Socket("192.168.10.1", 5000); // 3. 获取客户端socket 的输入和输出流. InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); // 4. 将客户端文件的名字上传到服务器. out.write(file.getName().getBytes()); // 5. 读取服务端的返回的消息. byte[] buffer = new byte[1024]; int len; len = in.read(buffer); String mess = new String(buffer, 0, len); // 6. 根据服务端的响应,判断文件是否存在. if ("文件存在无需上传".equals(mess)) { System.out.println(mess + ",客户端程序结束!!!"); socket.close(); return; } else { System.out.println(mess); } System.out.println("客户端开始上传!!!"); // 7. 在客户端创建字节输入流. 读取客户端的文件. FileInputStream fis = new FileInputStream(file); // 8. 客户端字节输入流循环读取. while ((len = fis.read(buffer)) != -1) { // 8. 客户端socket 的输出流写出数据. out.write(buffer, 0, len); } // 9. 文件上传完毕,发送结束标记. socket.shutdownOutput(); // 10. 客户端接收服务器的返回的消息. len = in.read(buffer); System.out.println(new String(buffer, 0, len)); // 11. 关闭客户端socket 客户端字节输入流. fis.close(); socket.close(); } public static File getFile() throws IOException { // 1.控制台获取用户需要上传的文件的路径. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("请输入上传文件的路径:"); String filePath = br.readLine(); File file = new File(filePath); // 2.路径不存在. if (!file.exists()) { System.out.println("路径不存在,请重新输入. "); continue; } // 2. 不支持目录. if (file.isDirectory()) { System.out.println("暂不支持目录上传,等待升级版!!!"); continue; } return file; } } }
服务器
package cn.itcast.b_upload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { // 1. 创建服务端. System.out.println("tcp 服务器启动.准备接收文件"); ServerSocket server = new ServerSocket(5000); while (true) { // 2. accept 方法等待客户端连接. final Socket socket = server.accept(); new Thread(new Runnable() { @Override public void run() { String ip = socket.getInetAddress().getHostAddress(); System.out.println("客户端:" + ip + "连接了.."); try { // 3. 获取服务端socket 的输入和输出流. InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); byte[] buffer = new byte[1024 * 8]; int len; // 4. 服务接收文件的名字. len = in.read(buffer); String fileName = new String(buffer, 0, len); // 5. 在服务器明确该文件保存的路径... File dir = new File("e:\\upload"); // 检测该目录是否存在. 如果不存在,必须创建. if (!dir.exists()) { dir.mkdir(); } // 6. 根据客户端上传的文件名,封装为一个File 对象. File file = new File(dir, fileName); // 7. 服务器, 检测文件是否存在. 如果存在就不再重复上传. if (file.exists()) { out.write("文件存在无需上传".getBytes()); socket.close(); return; } else { out.write("文件不存在可以上传".getBytes()); } System.out.println("服务端开始接收"); // 8. 服务器创建本地的字节输出流. 将socket 读取的数据持久化存储到服务器. FileOutputStream fos = new FileOutputStream(file); // 9. 服务器开始接收. while ((len = in.read(buffer)) != -1) { fos.write(buffer, 0, len); } System.out.println("服务器接收完毕!!!"); // 10. 服务器接收完毕,想客户端发送结束的消息. out.write("服务器成功接收完毕".getBytes()); // 11. 关闭服务端的创建的字节输出流. fos.close(); } catch (IOException e) { // e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { // e.printStackTrace(); } System.out.println("客户端:" + ip + "离开了.."); } } }).start(); } } }