做项目时,有个接口是要与外部软件进行socket通信,我作为客户端发送消息给server(是另外一个软件,C++开发的),然后server发送给我一个响应。响应里就包括有一个文件内容。现在我的做法是,我从socket拿到inputstream,然后用这个流去read数据到一个长度节的数组,再将这些字节写到我的本地文件中。但有一个特别郁闷的问题:就是如果我在此代码片段用断点一步步调试,就能生成一个完整的文件,但是如果我不打断点,每次都不能读到完整的文件,总会少很多数据。我在想,是不是outputstream写文件时,需要时间啊,还是socket的inputstream有什么问题导致发送数据太慢?
InputStream in = socket.getInputStream();byte[] buff=new byte[256];OutputStream out = new OutputStream(new File("a.xml"));while(in.avaliable()>0){        in.read(buff);         out.write(buff);}out.fflush();out.close();in.close();
后来我把字节数组改为25个还是有问题,就是说每次只让它读25个还有问题?太郁闷啦。求助!!!--------------
不知道在循环里,加上Thread.sleep(200)能不能让程序等待读入流的数据先缓冲过来呢?由于程序在公司,所以也无法模拟。

解决方案 »

  1.   

    没有试过,不确定,觉得是循环条件的问题,avaliable的值不是由程序来改变的,单步调试的时候,时间比较多,所以avaliable值可能会根据实际情况改变,而正常执行时,语句out.write(buff); 执行后,马上判断avaliable的值,这时avaliable的值可能还没有来得及改变。如果是等待一段时间,可能会有用,但时间多长,就难说了。
    建议可以每次循环完后,加上in = socket.getInputStream()试试。
      

  2.   

    while(in.avaliable()>0){        in.read(buff);        out.write(buff);} 改为
    while(in.read(buff)!=-1)
    {
            out.write(buff);
    } 呢?
      

  3.   

    不知道你从哪里看到的,没人会用什么 avaliable 来判断。你首先应该看官方文档,了解怎么用。http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html
      

  4.   

    你用下面的程序来试一下看:
    while(in.read(buff)!=-1) 

            out.write(buff);//将此处换成out.write(buff,len,end);
            //上面的哪个方法我不确定哟,你去查一下API看 

      

  5.   

    在网络传输中available 方法不一定是可靠的.
    available 只是指明当前从网络层获取的数据有多少可读,但是由于网络传输的是流,所以很显然在你调用该方法后,还会有数据达到你这(当你debug的时候,因为时间很长,所以当你查询available的时候所有的数据已经到达了.).所以你不能按照这个来读.实际上,一般socket的消息应该是有些约定的常用的方法:
    1.定长.比如你们约定每个消息固定为128.读124个字符就认为OK了.
    2.固定文件头,不定长:比如MSG128XXXX...表明这个消息总长是128+6
    3.特征符号或字符串:比如你们约定在每个消息后加一个换行符号,那么你在读取的时候可以根据是不是换行来判断是不是读到一个完整的msg