做项目时,有个接口是要与外部软件进行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)能不能让程序等待读入流的数据先缓冲过来呢?由于程序在公司,所以也无法模拟。
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)能不能让程序等待读入流的数据先缓冲过来呢?由于程序在公司,所以也无法模拟。
建议可以每次循环完后,加上in = socket.getInputStream()试试。
while(in.read(buff)!=-1)
{
out.write(buff);
} 呢?
while(in.read(buff)!=-1)
{
out.write(buff);//将此处换成out.write(buff,len,end);
//上面的哪个方法我不确定哟,你去查一下API看
}
available 只是指明当前从网络层获取的数据有多少可读,但是由于网络传输的是流,所以很显然在你调用该方法后,还会有数据达到你这(当你debug的时候,因为时间很长,所以当你查询available的时候所有的数据已经到达了.).所以你不能按照这个来读.实际上,一般socket的消息应该是有些约定的常用的方法:
1.定长.比如你们约定每个消息固定为128.读124个字符就认为OK了.
2.固定文件头,不定长:比如MSG128XXXX...表明这个消息总长是128+6
3.特征符号或字符串:比如你们约定在每个消息后加一个换行符号,那么你在读取的时候可以根据是不是换行来判断是不是读到一个完整的msg