我正在尝试编写一个程序,使用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);
这里我尝试跳过循环,如果该字节为空,则继续;声明,但事实并非如此 工作
答案 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();
}