使用字节缓冲区读取数据时避免垃圾数据

时间:2014-05-28 17:21:15

标签: java sockets tcp byte buffer

我正在尝试编写一个程序,使用java tcp套接字在客户端和服务器之间传输文件我使用64K的缓冲区大小但我面临的问题是,当tcp有时无法发送整个64K时它会发送剩下的部分例如32K 有一些空间左右的垃圾数据被读取端的缓冲区占用,使64K完成,因此不必要的数据使得文件在接收方无用。 有没有解决方案来解决这个问题?

我正在使用TCP协议,此代码用于将数据发送到客户端

File transferFile = new File ("Document.txt"); 
byte [] bytearray = new byte [1024]; int byRead=0; 
FileInputStream fin = new FileInputStream(transferFile); 
BufferedInputStream bin = new BufferedInputStream(fin);
OutputStream os = socket.getOutputStream(); 
while(byRead>-1){ byRead=bin.read(bytearray,0,bytearray.length);                
os.write(bytearray,0,bytearray.length);  
os.flush();}

客户端代码

byte [] bytearray = new byte [1024]; 
InputStream is = socket.getInputStream(); 
FileOutputStream fos = new FileOutputStream("C:\\Users\\NetBeansProjects\\"+filename);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(bytearray,0,bytearray.length); 
currentTot = bytesRead; System.out.println("Data is being read ...");
do { bytesRead = is.read(bytearray, 0, (bytearray.length)); 
if(bytesRead==0)continue; if(bytesRead >= 0) currentTot += bytesRead;
bos.write(bytearray,0,bytearray.length); } while(bytesRead > -1);

这里我尝试跳过循环,如果该字节为空,则继续;声明,但事实并非如此 工作

2 个答案:

答案 0 :(得分:0)

bos.write(bytearray,0,bytearray.length);

这应该是

bos.write(bytearray,0,bytesRead);

缓冲区中'bytesRead'之后的区域不受读取的干扰。这不是'垃圾'。这就是以前的一切。

答案 1 :(得分:0)

use CLIENT Side Code as below to get the total write bytes without garbage

int availableByte = socket.available();
 if (availableByte > 0) {
 byte[] buffer = new byte[availableByte];
 int bytesRead = socketInputStream.read(buffer);
 FileOutputStream fileOutputStream = new FileOutputStream(FilePath, true);
 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
 BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
 bufferedWriter.write(buffer.toString());
 bufferedWriter.close();
 }