客户端发送一个本地文件给服务器,服务器接收到这个文件并且存储到指定的文件夹中,并且给客户端回写“上传成功”
客户端
package JDBC_DemoDay07.TCP;/*@create 2021--01--05--14:07*/import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/*** 文件上传案例的客户端,读取本地文件,上传到服务器,读取服务器回写的数据** 实现步骤:* 1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源* 2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号* 3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象* 4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件* 5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器* 6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象* 7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据* 8.释放资源(FileInputStream,Socket)*/public class TCPClient {public static void main(String[] args) {try {//1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源FileInputStream fis = new FileInputStream("E:\\照骗\\A.JPG");// 2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号Socket socket = new Socket("localhost", 8898);// 3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象OutputStream os = socket.getOutputStream();// 4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {//5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器os.write(bytes, 0, len);}/*** 解决:上传完文件,给服务器写一个结束标记*/socket.shutdownOutput();//6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象InputStream is = socket.getInputStream();//7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据while ((len = is.read(bytes)) != -1) {System.out.println(new String(bytes, 0, len));}fis.close();socket.close();} catch (Exception e) {e.printStackTrace();}}}
服务器端
利用多线程处理多个客户端上传的文件,提高效率
package JDBC_DemoDay07.TCP;/*@create 2021--01--05--14:08*/import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.Random;/*** 文件上传案例服务器端:读取客户端上传的文件,保存到服务器的硬盘,给客户端回写“上传成功”* <p>* 明确:* 数据源:客户端上传的文件* 目的地:服务器的硬盘 D:\\a\\1.jpg* <p>* 实现步骤:* 1.创建一个服务器ServerSocket对象,和系统要指定的端口号* 2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象* 3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象* 4.判断D:\\a文件夹是否存在,不存在则创建* 5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地* 6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件* 7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上* 8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象* 9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写“上传成功”* 10.释放资源(FileOutputStream,Socket,ServerSocket)*/public class TCPServer {public static void main(String[] args) {try {//1.创建一个服务器ServerSocket对象,和系统要指定的端口号ServerSocket server = new ServerSocket(8898);//2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象/*** 让服务器一直处于监听状态(死循环accept方法)* 有一个客户端上传文件,就保存一个文件*/while (true) {Socket socket = server.accept();/*** 使用多线程技术,提高程序的效率* 有一个客户端上传文件,就开启一个线程,完成文件的上传*/new Thread(new Runnable() {//完成文件的上传@Overridepublic void run() {try {//3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象InputStream is = socket.getInputStream();//4.判断D:\\a文件夹是否存在,不存在则创建File file = new File("d:\\a");if (!file.exists()) {file.mkdir();}/*** 自定义一个文件的命名规则:防止同名的文件被覆盖* 规则:域名+毫秒值+随机数*/String fileName = "itcast" + System.currentTimeMillis() + new Random().nextInt(1010) + ".jpg";//5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);//6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {//7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上fos.write(bytes, 0, len);}//8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象OutputStream os = socket.getOutputStream();//9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写“上传成功”os.write("收到谢谢".getBytes());//10.释放资源(FileOutputStream,Socket,ServerSocket)fos.close();socket.close();} catch (Exception e) {}}}).start();}//服务器就不用关闭了//server.close();} catch (IOException e) {e.printStackTrace();}}}
服务器端接收到客户端文件中的数据,向服务器端的另一个文件中写出,接收到文件内容,写到某个文件中
客户端
package Test23_Demo.Demo06;/*@create 2020--12--16--15:14*/import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/*** 上传文件* 读取文件的内容,发送给服务器端*/public class client {public static void main(String[] args) throws IOException {//建立客户端Socket socket = new Socket("localhost", 8888);//建立连接后,获取socket的io流OutputStream outputStream = socket.getOutputStream();//获取文件的对象FileInputStream fis = new FileInputStream("stu.txt");//读取文件的内容int b = -1;while ((b = fis.read()) != -1) {outputStream.write(b);//输出数据给服务器}//关闭流fis.close();//告知服务器,不再发送数据了socket.shutdownOutput();//获取输入流,接收服务器端的相应InputStream in = socket.getInputStream();int read = in.read();System.out.println((char) read);//关闭socketsocket.close();}}
服务器端
package Test23_Demo.Demo06;/*@create 2020--12--16--15:13*/import HeiMa.Demo.Input;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 {//建立服务器ServerSocket serverSocket = new ServerSocket(8888);//获取流Socket accept = serverSocket.accept();//建立连接后,获取socket的流InputStream in = accept.getInputStream();//获取到上传文的内容,要有一个文件FileOutputStream fos = new FileOutputStream("ASCII码表完整版.doc");//反复使用一个字节读取int b = -1;while ((b = in.read()) != -1) {//一次读取一个字节,最终这个文件接收了所有的上传数据fos.write(b);}//关闭io流fos.close();//给客户端返回一个相应 - oOutputStream out = accept.getOutputStream();String content = "o";out.write(content.getBytes());//关闭socketaccept.close();serverSocket.close();}}
