欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

黑马程序员_网络编程-代码实现

程序员文章站 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();

		}

	}
}
 

 

相关标签: Client Server