- 单线程上传
- 服务端:
- 客户端:
- 多线程上传
- 修改服务端:
- 修改客户端
单线程上传
服务端:
public static void main(String[] args) {
        try ( // 创建一个ServerSocket监听8080端口的客户端请求
              ServerSocket server = new ServerSocket(8000);
// 使用accept()阻塞当前线程,等待客户端请求
              Socket socket = server.accept();
// 由Socket获得输入流,并创建缓冲输入流
              BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
              FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Pictures\\m66.png")) {
// 准备一个缓冲区
            byte[] buffer = new byte[1024];
// 首次从Socket读取数据
            int len = in.read(buffer);
            while (len != -1) {
// 写入数据到文件
                out.write(buffer, 0, len);
// 再次从Socket读取数据
                len = in.read(buffer);
            }System.out.println("接收完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }客户端:
/**
* @Author he
* @Description 测试Socket上传文件的客户端
* @Date 8.22
**/
public class UdpClient {
public static void main(String[] args) {
try ( // 向本机的8080端口发出请求
Socket socket = new Socket("127.0.0.1", 8000);
// 由Socket获得输出流,并创建缓冲输出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
// 创建文件输入流
FileInputStream fin = new FileInputStream("C:\\Users\\14172\\Pictures\\m11.png");
// 由文件输入流创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次读取文件
int len = in.read(buffer);
while (len != -1) {
// 数据写入Socket
out.write(buffer, 0, len);
// 再次读取文件
len = in.read(buffer);
}
System.out.println("上传成功!");
} catch (
ConnectException e) {
System.out.println("服务器未启动!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
查看文件:

 可以看到自己的目录下已经出现了C:\Users\14172\Pictures\m66.png
多线程上传
改成多线程的形式:
修改服务端:
public class isStream {
    public static void main(String[] args)throws Exception {
        ServerSocket server = new ServerSocket(8000);// 创建一个ServerSocket监听8080端口的客户端请求
// 使用accept()阻塞当前线程,等待客户端请求
        while (true) //(2)开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
        {
            Socket socket = server.accept();
            new ServerReadThread(socket).start();
        }
    }
class ServerReadThread extends Thread {
    static int number = 0;
    private Socket socket;
    public ServerReadThread(Socket socket) {
        this.socket = socket;
    }
@Override
    public void run(){
try(
// 由Socket获得输入流,并创建缓冲输入流
    BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
    FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\socket\\"+number+".png"))
{
    number++;
// 准备一个缓冲区
        byte[] buffer = new byte[1024];
// 首次从Socket读取数据
        int len = in.read(buffer);
        while (len != -1) {
// 写入数据到文件
            out.write(buffer, 0, len);
// 再次从Socket读取数据
            len = in.read(buffer);
            System.out.println("接收完成!");
        }
    } catch (FileNotFoundException fileNotFoundException) {
    fileNotFoundException.printStackTrace();
} catch (IOException ioException) {
    ioException.printStackTrace();
}
}
}查看结果:

修改客户端
修改为用户输入图片路径,进行多次上传图片:
public class UdpClient {
    public static void main(String[] args) throws IOException {
        int num = 0;
        Socket socket = new Socket("127.0.0.1", 8000);
        // 由Socket获得输出流,并创建缓冲输出流
        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
        Scanner scanner = new Scanner(System.in);
        // 创建文件输入流
        while (true) {
            num++;
            try ( // 向本机的8080端口发出请求
                  //System.out.println("输入文件路径:");
                  FileInputStream fin = new FileInputStream(scanner.nextLine());
                  // 由文件输入流创建缓冲输入流
                  BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
                byte[] buffer = new byte[1024];
// 首次读取文件
                int len = in.read(buffer);
                while (len != -1) {
// 数据写入Socket
                    out.write(buffer, 0, len);
// 再次读取文件
                    len = in.read(buffer);
                }
                System.out.println("上传成功!");
            } catch (ConnectException e) {
                System.out.println("服务器未启动!");
            } catch (IOException e) {
                e.printStackTrace();
            }
if(num == 5) break;
        }
    }
}
 查看目录:

 发现一个小问题:已经存在的一样的命名的图片不会覆盖
 然后有的图片传过去之后格式会损坏,貌似是jpg转为png命名的时候
                










