Java+socket 服务端读取图片发送给客户端,客户端保存图片到本地(完整代码)

简介

这是一个基于Gradle的使用TCP/IP协议通信的socket项目。实现服务端读取图片发送给客户端,客户端保存图片到本地。

完整项目代码见 https://github.com/AsajuHuishi/transferImageBySocket

如何使用idea建立Gradle项目

在新建Project时选择Gradle即可,具体可见https://blog.csdn.net/qq_39288090/article/details/97664859

环境

  • JDK 1.8
  • IntelliJ Idea 2020

目录结构

├─.gradle
│  ├─6.7
│  │  ├─executionHistory
│  │  ├─fileChanges
│  │  ├─fileHashes
│  │  ├─javaCompile
│  │  └─vcsMetadata-1
│  ├─buildOutputCleanup
│  ├─checksums
│  ├─configuration-cache
│  └─vcs-1
├─.idea
│  └─modules
├─build
│  ├─classes
│  │  └─java
│  │      └─main
│  ├─generated
│  │  └─sources
│  │      ├─annotationProcessor
│  │      │  └─java
│  │      │      └─main
│  │      └─headers
│  │          └─java
│  │              └─main
│  └─tmp
│      └─compileJava
├─gradle
│  └─wrapper
└─src
    ├─main
    │  ├─java			// our server and client code
    │  └─resources
    └─test
        ├─java
        └─resources

结果

服务端
在这里插入图片描述
客户端
在这里插入图片描述

注意事项

先运行服务器端,再运行客户端


服务端代码

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {
    
    
    /**
     * 先运行服务器端
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
    
    
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器准备就绪");
        // 等待客户端连接
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功");
        // 获取输入输出流
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        // 通信
        // 读数据
        byte[] bytes = new byte[30];
        int tempLength;
        while((tempLength = inputStream.read(bytes))!=-1){
    
    
            System.out.println(new String(bytes,0,tempLength));
        }
        // 发送数据
        outputStream.write("欢迎登录".getBytes(StandardCharsets.UTF_8));
        outputStream.flush();
        outputStream.write("图片传输将要开始".getBytes(StandardCharsets.UTF_8));
        outputStream.flush();
        // 服务器读取图片发送到客户端
        File file = new File("src//1.png");
        if(file.exists()){
    
    
            System.out.println("图片存在,可以传输");
            // 输入缓冲流
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
            // 输出缓冲流
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
            int length;
            while((length = bufferedInputStream.read(bytes))!=-1){
    
    
                bufferedOutputStream.write(bytes,0,length);
                bufferedOutputStream.flush();
            }
        }else{
    
    
            System.out.println("图片不存在");
        }

        // 关闭
        socket.close();

    }
}

客户端代码

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Client {
    
    
    public static void main(String[] args) throws IOException {
    
    
        Socket socket = new Socket("127.0.0.1", 8888);
        InetAddress address = socket.getInetAddress();
        System.out.println("客户端启动" + address);
        // 获取输入输出流
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        // 客户端写数据
        outputStream.write("hello".getBytes(StandardCharsets.UTF_8));
        outputStream.flush();
        socket.shutdownOutput();// 不加上这个会一直堵塞
        // 读取服务器端发送的数据
        byte[] bytes = new byte[30];
        int tempLength;
        while((tempLength = inputStream.read(bytes))!=-1){
    
    
            String s = new String(bytes, 0, tempLength);
            System.out.println(s);
            if(s.equals("图片传输将要开始")){
    
    
                break;
            }
        }
        // 接受服务器的图片,保存到本地
        int length;
        File file = new File("src//client.png");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
        while ((length = inputStream.read(bytes))!=-1){
    
    
            bufferedOutputStream.write(bytes,0,length);
        }
        System.out.println("图片接收完成");
        socket.close();
    }
}

Guess you like

Origin blog.csdn.net/qq_36937684/article/details/115554740