黑马程序员技术交流社区

标题: TCP文件传输可以走纯字节流吗? [打印本页]

作者: 熊亮    时间: 2013-9-27 20:49
标题: TCP文件传输可以走纯字节流吗?
  1. package Day23_网络编程;
  2. import java.io.*;
  3. import java.net.*;
  4. public class L14_TCP复制文件上 {
  5.         public static void main(String[] args)throws Exception
  6.         {
  7.                 Socket s = new Socket("192.168.1.101",10005);//定义客户端
  8.                
  9.                 BufferedInputStream bis =
  10.                         new BufferedInputStream(new FileInputStream("F:\\0.mp3"));  //定义输入流,读取文件
  11.                 BufferedOutputStream bos =
  12.                         new BufferedOutputStream(s.getOutputStream());   //定义网络输出流,传输文件

  13.                 int len = 0;
  14.                 while((len=bis.read())!=-1)   //循环读写
  15.                 {
  16.                         bos.write(len);
  17.                 }
  18.                 s.shutdownOutput();

  19.                 s.close();
  20.                 bis.close();
  21.         }
  22. }
复制代码
  1. package Day23_网络编程;
  2. import java.io.*;
  3. import java.net.*;
  4. public class L14_TCP复制文件下 {
  5.         public static void main(String[] args)throws Exception
  6.         {
  7.                 ServerSocket ss = new ServerSocket(10005);   //定义服务端
  8.                 Socket s = ss.accept();
  9.                 String ip = s.getInetAddress().getHostAddress();  
  10.                 System.out.println(ip+".....connected");
  11.                
  12.                 BufferedInputStream bis =
  13.                         new BufferedInputStream(s.getInputStream());    //定义网络输入流,接收传输数据
  14.                 BufferedOutputStream bos =
  15.                         new BufferedOutputStream(new FileOutputStream("F:\\1.mp3"));    //定义输出流,将数据存入硬盘
  16.                
  17.                 int len= 0 ;
  18.                 while((len=bis.read())!=-1)  //循环读写
  19.                 {
  20.                         bos.write(len);
  21.                 }
  22.                 ss.close();
  23.                 s.close();
  24.                 bos.close();
  25.         }
  26. }
复制代码
想到玩IO的时候,复制文本文件也可以用字节流,那TCP文件传输是不是也可以都走字节流?按这个想法写了这个TCP传输,MP3文件传输正常,但是文本文件传输后没有内容,这是什么问题呢?

作者: 麦子    时间: 2013-10-3 21:15
网络编程中的所有数据都以采用字节流的形式传输,但是要视具体问题而论,
为什么java又要弄个字符流呢?
为了更方便的操作文本类型,其实它底层用的还是字节流,字符流就是将这些复杂的转换过程封装起来
方便开发人员去操作文本类型

哥么,你的网络编程学的还不是很好,你客户端把数据都写到缓冲区里,你不刷一下,咋的让服务器接受呢??
修改方案如下:
  上端代码此处修改为
   while((len=bis.read())!=-1)   //循环读写
                {
                        bos.write(len);
                        bos.flush();
                }
  如果你要使用s.shutdownOutput();
  上面就应该用PrintWriter
   不知道我的解释,你是否理解,不懂可以M我,呵呵
作者: 李慧声    时间: 2013-10-3 23:10
老毕前面两天有讲过一个 字节流只取低八位的mp3实例,应该是哪个原因~
作者: 熊亮    时间: 2013-10-4 09:50
麦子 发表于 2013-10-3 21:15
网络编程中的所有数据都以采用字节流的形式传输,但是要视具体问题而论,
为什么java又要弄个字符流呢?
为 ...

感谢大神解救,刷新我懂了,只是为什么用s.shutdownOutput(); 要写PrintWriter呢

作者: 麦子    时间: 2013-10-4 16:05
继续解答楼上的问题:
   你要是用 BufferedOutputStream,想要把缓冲区里的发出去,就需要flush()一下
   大白话翻译:  就像你用一个 杯子 将一个桶里的水转到另一个 桶里去,杯子就是这个缓冲区,你从一个桶装了一杯水,然后倒入另一个桶中,flush()就相当于将剩满水的杯子的水倒入另一个桶中的  指令, 没这个指令,那就意味着你只是装了一杯水,然后就不动了

    你要是在不想用写flush(),那你就采用别的流  PrintWriter   ,该流既可以接受字符流,也可以接受字节流,最重要的是它有可以自动刷新的构造方法
              PrintWriter(OutputStream out, boolean autoFlush)
                      通过现有的 OutputStream 创建新的 PrintWriter。

不是说用s.shutdownOutput(); 非要用PrintWriter
我看了下你的代码,就算不用printwriter,也要s.shutdownOutput()
为啥呢? 大白话翻译:
  就是告诉你传输的服务器端,我的数据结束了,全部写完了
  若你不写该方法,也可以通过别的类似定义标记的方式,然后通过break 跳出循环 ,间接达到结束的效  
  果
其实s.shutdownOutput(),即使在流中添加了数据 -1,这样就跳出了该循环了
  while((len=bis.read())!=-1)  //循环读写
                {
                        bos.write(len);
                }

   不知道我的解释,是否清晰,还有不懂的可以M我

  
作者: 熊亮    时间: 2013-10-5 12:59
麦子 发表于 2013-10-4 16:05
继续解答楼上的问题:
   你要是用 BufferedOutputStream,想要把缓冲区里的发出去,就需要flush()一下
    ...

嗯,能理解了,比喻很生动






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2