JavaTCP协议传输大文件最后总会少些字节 学Java差不多1年 求解 谢谢

2201_75496012 2022-11-27 20:04:02

客户端

public class clientDemo07 {
    public static void main(String[] args) throws IOException {
        //TCP协议 需要经过三次握手 四次挥手
        //客户端先给服务端发送请求 等待服务端响应
        //服务端接收到以后 给客户端一个反馈 表示接收到了
        //客户端再次向服务端发送连接请求 确认连接


        //1.创建Socket类对象 带参构造方法 (String host,int port)
        //创建流套接字并将其连接到指定主机上的指定端口号
        Socket socket = new Socket("127.0.0.1", 10064);

        //2.使用Socket类中的getOutputStream()方法 返回一个字节输出流对象  网络中的流
        OutputStream os = socket.getOutputStream();

        //普通字节流传输速度慢 创建字节缓冲流 进行转换
        BufferedOutputStream bos = new BufferedOutputStream(os);

        //3.创建字节缓冲输入流 进行读取本地的文件 本地中的流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\jdk1.8.rar"));

        //4.声明一个变量
        int variable;

        //循环
        while ((variable = bis.read()) != -1) {
            //写数据
            bos.write(variable);
        }

        //read()方法不仅具有读的功能 同时具有阻塞功能
        //当客户端把数据传输到服务端以后 服务端并没有读完毕 因为没有给任何的标记
        //所以 需要给服务端一个标记语句
        //使用Socket类中的shutdownOutput()方法 暂时关闭输出流
        //给服务器一个结束标记 告诉服务器文件已经传输完毕
        socket.shutdownOutput();

        //当客户端给服务端发送一个数据以后
        //服务端会给客户端一个反馈
        //表示确认收到数据
        //创建字节输入流 进行接收
        //使用Socket类中的getInputStream()方法 返回一个字节输入流
        InputStream is = socket.getInputStream();

        //如果服务端使用字符流进行传输数据 那么客户端接收到反馈以后就会报错 乱码
        //字符+符号 那么读取就会报错
        //所以需要使用字符流 进行接收
        //但是Socket类中并没有返回字符流的方法 ?
        //使用转换流进行转换
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        //接收数据
        //声明一个变量
        String line;

        //循环 接收数据
        //因为String类是对象 并不是基本数据类型 所以默认值为null

        while ((line = br.readLine()) != null) {
            //输出
            System.out.println(line);
        }

        //最后一步
        //释放资源
        //注意释放顺序
        br.close();
        bis.close();
        os.close();
        socket.close();
    }
}

 

服务端

public class ServerDemo07 {
    public static void main(String[] args) throws IOException {
        //注意点:
        //先运行服务端 再运行客户端

        //1.创建ServerSocket类对象 带参构造方法 (int port)
        //创建绑定到指定端口的服务器套接字
        ServerSocket ss = new ServerSocket(10064);

        //2.使用ServerSocket类中的accept()方法 监听客户端的数据并接受它 并且具有阻塞功能 返回一个socket类对象
        Socket socket = ss.accept();

        //3.客户端发送数据以后 需要接收
        //使用Socket类中的getInputStream()方法 返回一个字节输入流对象
        InputStream is = socket.getInputStream();

        //普通字节流传输速度慢 使用字节缓冲流 网络中的流
        BufferedInputStream bis = new BufferedInputStream(is);


        //创建字节缓冲输出流 本地流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\jdk.rar"));

        //读写数据

        //声明一个变量
        int variable;

        //循环
        while ((variable = bis.read()) != -1) {
            //写数据
            bos.write(variable);
        }

        //当接收到客户端发送的数据以后 还需要给客户端一个反馈
        //创建字符缓冲输出流 转换流 OutputStreamWriter是字符流到字节流的桥梁
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        //写数据
        bw.write("数据上传成功 已经成功保存到本地");


        //最后一步
        //释放资源
        //注意释放顺序
        bw.close();
        bos.close();
        bis.close();
        socket.close();
        ss.close();
    }
}
...全文
85 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2022-12-02
  • 打赏
  • 举报
回复

那就去java版块问吧,这里毕竟还是不对口

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧