黑马程序员技术交流社区

标题: Socket复制文件问题 [打印本页]

作者: The_king丶    时间: 2014-12-24 17:58
标题: Socket复制文件问题
  1. package 课堂;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;

  10. /*
  11. * 模拟文件上传:客户端读取某个非文本文件,发送到服务器端,接收
  12. *  要求,先发送文件大小到服务器端,根据文件大小判断读写结束
  13. *  计算用时
  14. */
  15. public class Server_Server03 {
  16.         public static void main(String[] args) throws IOException {
  17.                 ServerSocket ss = new ServerSocket(8888);
  18.                 Socket s = ss.accept();

  19.                 BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
  20.                 BufferedOutputStream bos = new BufferedOutputStream(
  21.                                 new FileOutputStream("C:/Users/yy/Desktop/aa.jpg"));
  22.                 BufferedReader br = new BufferedReader(new InputStreamReader(
  23.                                 s.getInputStream()));
  24.                 // 长度
  25.                 String slength = br.readLine();
  26.                 System.out.println(slength);
  27.                 int length = Integer.parseInt(slength);
  28.                 System.out.println("长度为:" + length);
  29.                 byte[] b = new byte[length];
  30.                 bis.read(b);
  31.                 bos.write(b);
  32.                 bos.close();
  33.                 bis.close();
  34.                 System.out.println("复制成功");
  35.                 s.close();

  36.         }
  37. }
复制代码
  1. package 课堂;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.OutputStreamWriter;
  9. import java.net.Socket;

  10. /*
  11. * 模拟文件上传:客户端读取某个非文本文件,发送到服务器端,接收
  12. *  要求,先发送文件大小到服务器端,根据文件大小判断读写结束
  13. *  计算用时
  14. */
  15. public class Server_Socket03 {
  16.         public static void main(String[] args) throws IOException {
  17.                 Socket s = new Socket("localhost", 8888);
  18.                 File file = new File("C:/Users/yy/Desktop/bb.jpg");
  19.                 FileInputStream fis = new FileInputStream(file);
  20.                 BufferedInputStream bis = new BufferedInputStream(fis);
  21.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
  22.                                 s.getOutputStream()));
  23.                 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());

  24.                 long length = file.length();
  25.                 bw.write("" + length);
  26.                 bw.newLine();
  27.                 bw.flush();
  28.                 System.out.println(length);

  29.                 byte[] b = new byte[(int) length];
  30.                 bis.read(b);
  31.                 bos.write(b);
  32.                 bos.flush();
  33.                 bis.close();
  34.                 bw.close();
  35.                 bos.close();
  36.                 s.close();
  37.                 fis.close();

  38.         }
  39. }
复制代码
复制到最后会有错误,这是个什么情况?求详细解析。


作者: Mr.Ni    时间: 2014-12-25 12:25
bos.write(b);看了一下,写出的时候怎么还写到数组里面,要写到输出流里面,你不是定义了输出流么,都没有用上。服务端也是,也要写到输出流里面。
还有这样写文件的大小不能超过2G,int的最大值是2147483647 字节,也就1.9999999G

作者: The_king丶    时间: 2014-12-25 13:45
Mr.Ni 发表于 2014-12-25 12:25
bos.write(b);看了一下,写出的时候怎么还写到数组里面,要写到输出流里面,你不是定义了输出流么,都没有 ...

将 b.length 个字节从指定的 byte 数组写入此输出流。我那句是那个意思。
作者: Mr.Ni    时间: 2014-12-25 17:31
{:2_41:}我刚才搞错了。。。
你这里在服务端用了两个读取流操作同一个s.getInputStream()
我试了一下,从客户端写两行话,在服务端用一个读取流依次读取两句话,正常显示
用两个不同的流操作s.getInputStream(),第一个读到第一行,第二个读到是乱码。
可能你的问题跟这个有关。




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