TCP上传案例(将图片从客户端上传至服务器)

程序运行时,优先运行服务端,因为服务端要开始等待客户端上传图片

服务端线程


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;

public class ServerThread implements Runnable {
    private Socket socket;
    private String dir;

    public ServerThread(Socket socket, String dir) {
        this.socket = socket;
        this.dir = dir;
    }

    @Override
    public void run() {
        try {
            File file = new File(dir);
            // 确定文件路径是否存在,如果不存在,创建目录
            if (!file.exists()) {
                file.mkdirs();
            }
            // 随机生成一个UUID号,确保保存的图片名字不重复
            UUID uuid = UUID.randomUUID();
            // 将UUID转换成字符串,并将"-"替换成""空字符串
            String name = uuid.toString().replaceAll("-", "");
            // 声明字节输出流,用来将接受到的图片输出到指定的位置
            FileOutputStream fos = new FileOutputStream(new File(file, name + ".jpg"));
            // 声明一个字节读取流,准备客户端发动的数据进行读取
            InputStream is = socket.getInputStream();
            // 声明一个字节数组,用来存放后面读取到的数据
            byte[] buffer = new byte[1024];
            // 用来判断读取到字节的长度
            int len = -1;
            // 循环读取客户端发送的字节数据
            while ((len = is.read(buffer)) != -1) {
                // 将读取到的数据写入到指定路径下
                fos.write(buffer, 0, len);
                // 刷新数据
                fos.flush();
            }
            // 关闭字节输出流
            fos.close();



            //------给客户端返回确认信息------
            OutputStream os = socket.getOutputStream();
            os.write("上传成功".getBytes());
            os.flush();
            socket.shutdownOutput();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

服务端


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

public class ServerDemo {

    public static void main(String[] args) throws IOException {
        // 声明端口号为10086的服务器 套接字
        ServerSocket serverSocket = new ServerSocket(10086);
        while (true) {
            Socket socket = serverSocket.accept();// 阻塞方法,等待客户端传输数据
            // 创建服务器自定义线程对象
            ServerThread serverThread = new ServerThread(socket,"d:\\aaa\\bbb");
            // 开启线程
            new Thread(serverThread).start();
        }
    }
}

客户端


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

public class ClientDemo {

    public static void main(String[] args) throws IOException {
        // 此处用的IP地址是本地IP地址
        InetAddress address = InetAddress.getByName("192.168.42.105");
        // 创建一个客户端 套接字 对象
        Socket socket = new Socket(address, 10086);
        // 声明一个字节读取流
        FileInputStream fis = new FileInputStream(new File("e:\\柳岩.jpg"));
        byte[] buffer = new byte[1024];
        int len = -1;
        // 声明一个字节输出流,用来将读到的数据写入到服务器
        OutputStream os = socket.getOutputStream();
        // 循环读取"e:\\柳岩.jpg"路径的图片字节
        while ((len = fis.read(buffer)) != -1) {
            // 将读取到的字节写到服务器
            os.write(buffer, 0, len);
            // 刷新数据
            os.flush();
        }
        // 关闭字节读取流
        fis.close();
        socket.shutdownOutput();

        // ---接受客户端返回的信息----
        InputStream is = socket.getInputStream();
        while ((len = is.read(buffer)) != -1) {
            System.out.println(new String(buffer, 0, len));
        }
        socket.close();
    }

}

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/80184821