m0_64445664 2022-08-20 10:16 采纳率: 0%
浏览 23

使用TCP进行文件传输时,客户端到服务端无法使用bufferedOutputStream

在发送端,如果我用outputStream传输到服务端是可以的,但是如果用bufferedoutputstream,在服务端就接受不到数据,连接什么都正常。。

发送端数据如下
package com.itheima.javaSE.Internet;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class TCPsend {
public static void main(String[] args) throws IOException {
faild();
}

private static void faild() throws IOException {
    //本地的流,将数据写到内存
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\86130\\Desktop\\新建文件夹\\a.txt"));
    //网络的流,将数据写到网络
    Socket socket = new Socket("127.0.0.1", 10002);
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    //读取和写入操作
    byte[] bytes = new byte[1024];
    int len;
    while ((len = bis.read(bytes)) != -1) {
        System.out.println(bytes);
        bos.write(bytes, 0, len);
    }
    //给服务器一个结束标记
    socket.shutdownOutput();
    //接收服务器的数据
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    socket.close();
    bis.close();
}

}

接收端代码如下
public class TCPreceive {
public static void main(String[] args) throws IOException {
faild();
}

private static void faild() throws IOException {
    ServerSocket ss = new ServerSocket(10002);

    Socket accept = ss.accept();
    //网络中的流
    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
    //本地的流
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\86130\\Desktop\\新建文件夹\\b.txt"));
    byte[] bytes = new byte[1024];
    int len;
    while ((len = bis.read(bytes)) != -1) {
        bos.write(bytes, 0, len);
    }
    //回信
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
    bw.write("下载完毕!");
    bw.newLine();
    bw.flush();

    accept.close();
    ss.close();
    bos.close();
}

}
更改后的发送端数据如下(服务端能接受数据)
package com.itheima.javaSE.Internet;

import java.io.*;
import java.net.Socket;
import java.util.Arrays;

public class TCPsend {
public static void main(String[] args) throws IOException {
faild();
}

private static void faild() throws IOException {
    //本地的流,将数据写到内存
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\86130\\Desktop\\新建文件夹\\a.txt"));
    //网络的流,将数据写到网络
    Socket socket = new Socket("127.0.0.1", 10002);
    OutputStream os = socket.getOutputStream();
    //读取和写入操作
    byte[] bytes = new byte[1024];
    int len;
    while ((len = bis.read(bytes)) != -1) {
        System.out.println(bytes);
        os.write(bytes, 0, len);
    }
    //给服务器一个结束标记
    socket.shutdownOutput();
    //接收服务器的数据
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    socket.close();
    bis.close();
}

}

  • 写回答

1条回答 默认 最新

  • 等一下,我黑切呢? 2022-08-20 15:22
    关注

    猜测是写入BufferedOutputStream的数据应缓存空间没有被填充满所以还在缓存中所以需要flush()把数据刷出来

    评论

报告相同问题?

问题事件

  • 创建了问题 8月20日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件