黑马程序员技术交流社区

标题: 这TCP客户 服务端 之间 复制文件为什么不行? [打印本页]

作者: 黄鸿达    时间: 2013-2-21 17:41
标题: 这TCP客户 服务端 之间 复制文件为什么不行?
本帖最后由 黄鸿达 于 2013-2-21 17:59 编辑
  1. import java.io.*;
  2. import java.net.*;
  3. public class Send2 {
  4.         

  5.         public static void main(String[] args) {
  6.                 try {
  7.                         Socket s=new Socket("192.168.1.102",12000);
  8.                         BufferedInputStream br=
  9.                                 new BufferedInputStream(new FileInputStream("D:\\1.txt"));
  10.                         BufferedOutputStream bw=
  11.                                 new BufferedOutputStream((s.getOutputStream()));

  12.                         int len=0;
  13.                         while((len=br.read())!=-1){
  14.                                 bw.write(len);

  15.                         }
  16.                         br.close();
  17.                         bw.close();
  18.                 } catch (Exception e) {
  19.                 }
  20.            
  21. }
  22. }
复制代码
  1. import java.io.*;
  2. import java.net.*;
  3. public class Re2 {


  4.         public static void main(String[] args) {
  5.             
  6.                 try {
  7.                         ServerSocket ss=new ServerSocket(12000);
  8.                         System.out.print("1");
  9.                         Socket s=ss.accept();
  10.                         System.out.print("2");
  11.                         BufferedInputStream br=
  12.                                 new BufferedInputStream(s.getInputStream());
  13.                         BufferedOutputStream bw=
  14.                                 new BufferedOutputStream(new FileOutputStream("D:\\2.txt"));               
  15.                         
  16.                         int len=0;
  17.                         while((len=br.read())!=-1){
  18.                                 bw.write(len);
  19.                         }
  20.                         br.close();
  21.                         bw.close();
  22.                 } catch (Exception e) {
  23.                 }
  24.       
  25.         }

  26. }
复制代码
尝试开启服务器端程序Re2 但是执行到打印1之后结束整个程序没有执行到下面的打印2程序,想不通






作者: 李挺    时间: 2013-2-21 17:58
服务端没有接受到文件传完的标志,那个while循环是没法结束的
你在send2的while循环后面加个s.shutdownOutput();试试
作者: 黄鸿达    时间: 2013-2-21 18:02
找到问题了,想到能发生异常,所以在catch语句那里加了e.toStirng

发现了bind exception 异常

原来serversocket创建时 端口被占用的问题

因为之前有个小程序也用了这个端口以至于被占用

后来改了serversocket的端口, 程序就顺利完成了

作者: 寇弘禄    时间: 2013-2-21 18:03
  int len=0;

15.                        while((len=br.read())!=-1){

16.                                bw.write(len);      这里应该是bw.write((char)len)

17.

18.                        }


作者: 胥文    时间: 2013-2-21 18:25
两个问题:1,是你把文件写入流中之后没有flush();2,要判断一下d:\\2.txt是否存在
客户端:
public class Test22 {

        /**
         * @param args
         * @throws Exception
         * @throws UnknownHostException
         */
        public static void main(String[] args) throws UnknownHostException, Exception {
                // TODO Auto-generated method stub
                Socket s = new Socket("192.168.0.6",10000);
                BufferedInputStream bfri =
                        new BufferedInputStream(new FileInputStream("D:\\1.txt"));
                BufferedOutputStream buo =
                        new BufferedOutputStream(s.getOutputStream());
                int len;
                while((len = bfri.read())!=-1)
                {       
                        buo.write(len);
                        buo.flush();
                }
                bfri.close();
                buo.close();
               
               
        }

}
服务端:

public class Test23 {

        /**
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
                ServerSocket ss = new ServerSocket(10000);
                Socket s = ss.accept();
                String ip = s.getInetAddress().getHostAddress();
               
                BufferedInputStream bufi =
                        new BufferedInputStream(s.getInputStream());
                File f = new File("d:\\2.txt");
                if(!(f.exists()))
                                f.createNewFile();
                BufferedOutputStream bufo =
                        new BufferedOutputStream(new FileOutputStream(f));
                int len;
                while((len = bufi.read())!=-1)
                {
                        bufo.write(len);
                        bufo.flush();
                       
                       
                }
               
               
               

        }

}
作者: 罗海云    时间: 2013-2-21 20:28
可以用另一种方法.把BufferedOutputStream bw=new BufferedOutputStream((s.getOutputStream()));  改为PrintWriter对象.里面自动带刷新功能,, 就不会忘记刷新了.呵呵








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