java简单socket实现文件上传

 

服务端



import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TestDataServer {
    private static ServerSocket server;
    private static Socket client;
    private static DataInputStream dis;

    public static void main(String[] args) throws IOException {
        try {
            //创建服务端并监听5454端口
            server = new ServerSocket(5454);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            //阻塞循环,直到收到客户端的连接
            client = server.accept();
            //得到input流用于数据的获取
            dis = new DataInputStream(client.getInputStream());
            //得到客户端写入的文件名
            String name = dis.readUTF();
            //得到文件的字节数组
            byte[] bytes = dis.readAllBytes();
            //创建一个output流用于保存文件
            FileOutputStream fos = new FileOutputStream("C:\\Users\\pc\\Desktop\\myproject\\temp\\" + name);
            //将文件的字节数组写入output流中
            fos.write(bytes);
            //关闭相应的流
            fos.close();
            dis.close();
            System.out.println("文件:"+name+"上传成功!");
        }
    }
}

 

客户端



import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class TestDataClient {
    public static void main(String[] args) throws IOException {
        //以需要上传的文件的绝对路径作为参数创建客户端上传对象
        new ClientUpPicture("C:\\Users\\pc\\Desktop\\a.jpg");
    }
}

class ClientUpPicture implements Runnable{
    private static Socket client;
    private static FileInputStream fis;
    private static DataOutputStream dos;
    private static String filename;
    public ClientUpPicture(){}
    public ClientUpPicture(String filename){
        this.filename=filename;
        this.run();
    }
    @Override
    public void run() {
        try {
            //创建socket指向指定的地址
            client=new Socket("127.0.0.1", 5454);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            //创建文件input流
            fis = new FileInputStream(filename);
            //得到socket的output用于数据写入
            dos = new DataOutputStream(client.getOutputStream());
            //写入字符串作为服务端的文件名
            dos.writeUTF(dealName(filename));
            //写入文件inputt流
            dos.write(fis.readAllBytes());
            //关闭相应的流
            dos.close();
            fis.close();
            System.out.println("文件:"+dealName(filename)+"上传成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //将一个完整的文件路径处理得到文件名
    public String dealName(String filename){
        return filename.split("\\\\")[filename.split("\\\\").length-1];
    }
}

注意:相关流在使用完毕后一定要关闭,否则可能出现问题,例如在使用FileOutputStream写数据进入文件时,如果不关闭则会造成文件无法正常写入的问题。仔细想想,就好像你打开一个文档,写了一大堆情话,却忘记保存就关闭了。

猜你喜欢

转载自blog.csdn.net/qq_41294444/article/details/82110546