A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huoxy 中级黑马   /  2014-12-14 22:09  /  1306 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class UpLoadServer
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 //创建服务器端套接字监听指定端口
  6.                 ServerSocket server = new ServerSocket(11111);

  7.                 //获取连接的客户端套接字,并显示连接成功
  8.                 Socket client = server.accept();
  9.                 String ip = client.getInetAddress().getHostAddress();
  10.                 System.out.println(ip+" 连接成功!");

  11.                 //获取客户端套接字输入流,接收客户端上传的数据
  12.                 BufferedInputStream bufIn =
  13.                                 new BufferedInputStream(client.getInputStream());
  14.                
  15.                 //定义缓冲区输出流,向服务器端写数据
  16.                 BufferedOutputStream bufOut =
  17.                                 new BufferedOutputStream(new FileOutputStream("d:\\heima_server.jpg"));

  18.                 //将客户端上传的数据存储在服务器端
  19.                 byte[] buf = new byte[1024];
  20.                 int len = 0;
  21.                 while ((len = bufIn.read(buf))!=-1)
  22.                 {
  23.                         bufOut.write(buf,0,len);
  24.                 }

  25.                 //上传完成后,向客户端反馈传输结果
  26.                 OutputStream out = client.getOutputStream();
  27.                 out.write("上传成功!".getBytes());

  28.                 //关闭资源
  29.                 bufOut.close();
  30.                 client.close();
  31.                 server.close();
  32.         }
  33. }

  34. public class UpLoadClient {

  35.         public static void main(String[] args) throws Exception
  36.         {
  37.                 //在建立客户端套接字连接到指定服务器端
  38.                 Socket client = new Socket("192.168.100.4",11111);

  39.                 //用字节缓冲区对象读取本地的文件
  40.                 BufferedInputStream bufIn =
  41.                                 new BufferedInputStream(new FileInputStream("D:\\heima.jpg"));
  42.                
  43.                 //获取客户端套接字的输出流,向服务器端上传数据
  44.                 BufferedOutputStream bufOut =
  45.                                 new BufferedOutputStream(client.getOutputStream());

  46.                 //将本地文件上传到服务器端
  47.                 byte[] buf = new byte[1024];
  48.                 int len = 0;
  49.                 while ((len = bufIn.read(buf))!=-1)
  50.                 {
  51.                         bufOut.write(buf,0,len);
  52.                 }
  53.                
  54.                 //文件上传完毕,关闭输出流
  55.                 client.shutdownOutput();

  56.                 //获取客户端套接字输入流,接收服务器端反馈信息
  57.                 InputStream in = client.getInputStream();
  58.                 byte[] result = new byte[1024];
  59.                 int num = in.read(result);
  60.                 System.out.println(new String(result,0,num));

  61.                 //关闭资源
  62.                 bufIn.close();
  63.                 client.close();
  64.         }
  65. }
复制代码

少4K数据.JPG (29.98 KB, 下载次数: 19)

少4K数据.JPG

7 个回复

倒序浏览
另:刚刚试了把所有的缓冲区流对象都去掉时,用基础的字节流可以完整的复制,为什么用了缓冲区会少4K数据呢?求大神指导!
回复 使用道具 举报
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!
回复 使用道具 举报
小小志 发表于 2014-12-14 22:29
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!

字节流不用刷新的吧!
回复 使用道具 举报
小小志 发表于 2014-12-14 22:29
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!

好像是这个问题,把客户端的bufOut.flush();之后就可以完整复制了!但问题来了:不是一直说字节流不需要刷新的吗?能解释一下吗?
回复 使用道具 举报
huoxy 发表于 2014-12-15 09:29
好像是这个问题,把客户端的bufOut.flush();之后就可以完整复制了!但问题来了:不是一直说字节流不需要 ...

没有人说字节流不需要刷新的,你说的是PrintStream吧,这个内部也有刷新的。。。
回复 使用道具 举报
回复 使用道具 举报
huoxy 中级黑马 2014-12-15 13:36:06
8#
Rain2692 发表于 2014-12-15 12:54
没有人说字节流不需要刷新的,你说的是PrintStream吧,这个内部也有刷新的。。。 ...

老毕视频里第一次将字节流的时候就说了字节流不需要刷新。看了小小志哥们分享的那个链接,有点明白了,只要涉及缓冲区的字节流都需要刷新。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马