黑马程序员技术交流社区

标题: TCP文件复制错误,请帮忙! [打印本页]

作者: 张晨    时间: 2011-11-8 13:25
标题: TCP文件复制错误,请帮忙!
Help with Tcp problem
  1. import java.net.*;
  2. import java.io.*;

  3. public class SendFile {

  4.     public void send()throws Exception{
  5.         Socket socket =
  6.                 new Socket (InetAddress.getByName("192.168.1.5"),10000);
  7.         BufferedInputStream bis =
  8.                 new BufferedInputStream(new FileInputStream("D:\\hello.txt"));
  9.         BufferedOutputStream socketOut = new BufferedOutputStream(socket.getOutputStream());
  10.          
  11.         byte[] buff = new byte[1024];
  12.         int len ;
  13.         while ( (len = bis.read(buff))!=-1)
  14.         {
  15.             socketOut.write(buff);
  16.         }
  17.         System.out.println("finished");
  18.         socket.shutdownOutput();
  19.         BufferedReader socketInput =
  20.                 new BufferedReader( new InputStreamReader(socket.getInputStream()));
  21.         String s = socketInput.readLine();
  22.         System.out.println(s);
  23.         bis.close();
  24.         socket.close();
  25.     }
  26.      
  27.      
  28.     public static void main(String[] args) throws Exception {
  29.         SendFile s = new SendFile();
  30.         s.send();
  31.     }

  32. }
复制代码
Server:
  1. import java.io.*;
  2. import java.net.*;

  3. public class ReceiveFile {
  4.   
  5.     public void Receive() throws Exception{
  6.         ServerSocket serSocket = new ServerSocket(10000);
  7.         Socket socket = serSocket.accept();
  8.          
  9.         BufferedOutputStream fileOut =
  10.                 new BufferedOutputStream(new FileOutputStream("E:\\hello.txt"));
  11.          
  12.         BufferedInputStream inSocket =
  13.                 new BufferedInputStream(socket.getInputStream());
  14.          
  15.         byte[] buf = new byte[1024];
  16.         int len =0;
  17.         System.out.println("Going to While");
  18.         while ( (len = inSocket.read(buf))!=-1)   // i cant go into this loop
  19.         {
  20.             System.out.println("s"+new String(buf, 0,  len));  //because this line  never printed
  21.             fileOut.write(buf, 0, len);
  22.             fileOut.flush();
  23.             
  24.         }
  25.         String s = "finished!";
  26.         System.out.println(s);
  27.         DataOutputStream socketOut = new DataOutputStream(socket.getOutputStream());
  28.         socketOut.writeBytes(s);
  29.          
  30.         fileOut.close();
  31.         socket.close();
  32.         serSocket.close();      
  33.     }
  34.      
  35.     public static void main(String[] args) throws Exception {
  36.         ReceiveFile rec = new ReceiveFile();
  37.         rec.Receive();
  38.     }

  39. }
复制代码
the problem was described inside the code(line 18 in the last code), can anyone help me with that?
作者: 李建雄    时间: 2011-11-8 13:41
不好意思,我不会用english 回答,

socketOut.write(buff);  后面加一句 socketOut.flush();
问题解决就ok 了

good luck!!




作者: 张晨    时间: 2011-11-8 13:49
写入循环还是没有进去,所以创建的文件是空的
这个应该和缓冲区没关系,应为最后我把流关掉,会刷新缓冲区

我用english其实因为发在一个英文论坛拉,直接复制过来的,别见怪。
作者: 张晨    时间: 2011-11-8 13:56
后来我把与Socket相关的流 都写成OutputStram out= socket.getOutputStream (input也是)然后就对了, 很奇怪就不能用缓冲区技术吗?
作者: olkldksl    时间: 2011-11-8 14:24
bufferedoutputstream里的write方法
void write(byte[] b, int off, int len)
void write(int b)
你第一个文件里循环语句里的方法参数不合适吧,是不是应该加上“0,len”
作者: 李建雄    时间: 2011-11-8 14:44
张晨 发表于 2011-11-8 13:49
写入循环还是没有进去,所以创建的文件是空的
这个应该和缓冲区没关系,应为最后我把流关掉,会刷新缓冲区
...

用缓存就要flush啊,我都运行了你的,可以的,

不用缓存,就可以不flush();吧,这个我没试过

作者: 李建雄    时间: 2011-11-8 14:52
张晨 发表于 2011-11-8 13:56
后来我把与Socket相关的流 都写成OutputStram out= socket.getOutputStream (input也是)然后就对了, 很奇 ...

因为你没有fulsh() 就 socket.shutdownOutput();
就结束了写入,server已经停止读取了,

最后才fsocket.close(),这里面的自动刷新来得太迟了



作者: 李建雄    时间: 2011-11-8 14:55
olkldksl 发表于 2011-11-8 14:24
bufferedoutputstream里的write方法
void write(byte[] b, int off, int len)
void write(int b)

不加o,len 也行,不过这样的话,得到的文件,就会比原来的文件,大一点,
作者: 张晨    时间: 2011-11-8 15:08
李建雄 发表于 2011-11-8 14:52
因为你没有fulsh() 就 socket.shutdownOutput();
就结束了写入,server已经停止读取了,

恩,是我错了,加了fulsh()可以,我又实验过,谢谢!:victory:




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