0
点赞
收藏
分享

微信扫一扫

JAVA-文件上传案列实现

b91bff6ffdb5 2022-04-16 阅读 117
java

TCP通信的文件上传案列,即便是客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上,即是文件的复制,文件的下载是相同的原理。

实现步骤:
1、客户端使用本地的字节输入流,读取要上传的文件
2、客户端使用网络字节输出流,把读取到的文件上传到服务器
3、服务器使用网络字节输入流 ,读取客户端上传的文件
4、服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上
5、服务器使用网络字节输出流,给客户端回复上传成功
6、客户端使用网络字节输入流,读取服务器回写的数据
7、释放资源

客户端和服务器和本地硬盘进行读写,使用自己创建的字节流对象,即是本地流。

客户端和服务器之间读写,使用Socket中提供的字节流对象,即是网络流。

代码实现:
客户端:

package Demo34.FileUpload;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        FileInputStream fis  = new FileInputStream("E:\\aa.jpg");
        //向服务器端发送数据本地读取到的文件
        Socket socket = new Socket("127.0.0.1",8888);
        OutputStream os = socket.getOutputStream();
        int len =0;
        byte[] bytes = new byte[1024];
        while ((len= fis.read(bytes)) != -1){
            os.write(bytes,0,len);
        }
        //对于TCP套接字,任何以前写入的数据都将被发送 ,并且后跟TCP的正常连接终止序列
        //此方法用来禁用此套接字的输出流,即给服务器一个结束标记
        socket.shutdownOutput();
        //读取服务器端回写的信息
        InputStream is = socket.getInputStream();
        while ((len = is.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        fis.close();
        socket.close();
    }
}

服务器端:

package Demo34.FileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            Socket socket = serverSocket.accept();
            //使用多线程提高效率
            new Thread(new Runnable() {
                //父类run 方法没有声明抛出异常,子类重写只能try catch
                @Override
                public void run() {
                    try {
                        //获取网络字节输入流对象
                        InputStream is = socket.getInputStream();
                        File file = new File("D:\\upload");
                        if(!file.exists()){
                            file.mkdirs();
                        }
                        //自定义文件名称
                        String filename = "file_" + System.currentTimeMillis() + ".jpg";
                        FileOutputStream fos = new FileOutputStream(file + "\\" + filename);
                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len= is.read(bytes)) != -1){
                            fos.write(bytes,0,len);
                        }
                        socket.getOutputStream().write("上传成功".getBytes());
                        fos.close();
                        socket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}
 

举报

相关推荐

0 条评论