栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

网络多线程——网络上传文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网络多线程——网络上传文件

应用案例:客户端上传一张图片到服务端
  1. 编写一个服务端,和一个客户端
  2. 服务器端在 8888 端口监听
  3. 客户端连接到服务端,发送一张图片:e:baidu.png
  4. 服务器端接收到客户端发送的图片,保存到 src 下,发送 “收到图片” 再退出
  5. 客户端接收到服务端发送的 “收到图片”,再退出

分析:

设计一个 StreamUtils 工具类

package net;

import java.io.*;


public class StreamUtils {

    
    public static byte[] streamToByteArray(InputStream is) throws IOException {
        // 1. 创建字节数组输出流对象 bos
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int len;
        // 2. 通过 is 循环读取文件,将读取到的数据写入 bos 中
        while((len = is.read(b)) != -1){
            bos.write(b, 0, len);
        }
        // 3. 将 bos 转成字节数组,返回给 array
        byte[] array = bos.toByteArray();
        bos.close();
        // 4. array 即为读取的文件的 字节数组
        return array;
    }

    
    public static String streamToString(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while((line = reader.readLine()) != null){
            stringBuilder.append(line + "rn");
        }
        return stringBuilder.toString();
    }

}



服务端

package net;

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


public class TCPFileUploadServer {
    public static void main(String[] args) throws IOException {

        // 1. 监听 8888 端口,等待连接
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务端监听 8888 端口,等待连接......");
        // 2. 等待连接
        Socket socket = serverSocket.accept();
        // 3. 读取客户端发送的数据
        //    通过 Socket 得到输入流
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        // 4. 将得到的 bytes 数组写入到指定的路径,就得到一个文件了
        String destFilePath = "src\baidu2.png";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
        bos.write(bytes);

        // 向客户端回复 ”收到图片“
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write("收到图片");
        writer.flush(); // 把内容刷新到数据通道
        socket.shutdownOutput(); // 设置写入结束标记

        // 5. 关闭资源
        bos.close();
        bis.close();
        socket.close();
        serverSocket.close();
    }



}



客户端

package net;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;


public class TCPFileUploadClient {
    public static void main(String[] args) throws IOException {

        // 1. 客户端连接服务端 8888 ,并返回 Socket 对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        // 2. 创建读取磁盘文件的输入流
        String filePath = "E:\baidu.png";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
        // 3. bytes 就是 filePath 对应的字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        // 4. 通过 socket 获取输出流,将 bytes 写入到数据通道
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes);
        // 5. 设置写入数据的结束标记
        socket.shutdownOutput();

        // 接收从服务端回复的消息
        InputStream inputStream = socket.getInputStream();
        // 使用 StreamUtils 的方法,直接将 inputStream 读取到的数据转成字符串
        String s = StreamUtils.streamToString(inputStream);
        System.out.println(s);

        // 6. 关闭相关的流
        bis.close();
        bos.close();
        socket.close();
    }

}




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/307103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号