Java 奇怪的是,服务器收到的数据比我从客户机收到的多

Java 奇怪的是,服务器收到的数据比我从客户机收到的多,java,Java,我发送了一个大约500kb的图像,但在服务器上,接收的图像超过500kb。我想知道我是否有任何逻辑问题?网络速度约为100kb/s 客户 package client; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.IOException;

我发送了一个大约500kb的图像,但在服务器上,接收的图像超过500kb。我想知道我是否有任何逻辑问题?网络速度约为100kb/s

客户

package client;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class client {
    public static void main(String[] args) {
        Socket s = null;
        BufferedOutputStream bo = null;
        BufferedInputStream bi = null;
        try {
            s = new Socket("127.0.0.1",12349);
            bo = new BufferedOutputStream(s.getOutputStream());
            bi = new BufferedInputStream(new FileInputStream("1.jpg"));
            byte [] bys =new byte[1024];
            while((bi.read(bys))!=-1){
                bo.write(bys);
            }
            bo.flush();
            System.out.println("already post the image");
            bi.close();

        } catch (IOException e) {

        }finally{
            try {
                s.close();
            } catch (IOException e) {
                System.out.println("close failed");
            }
        }
    }
}
服务器

package server;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class sserver {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket s = null;
        BufferedOutputStream bo = null;
        BufferedInputStream bs = null;
        try {
            ss = new ServerSocket(12349);
            s = ss.accept();
            bo = new BufferedOutputStream(new FileOutputStream("2.jpg"));
            bs = new BufferedInputStream(s.getInputStream());
            byte [] bys =new byte[1024];
            while((bs.read(bys))!=-1){
                bo.write(bys);
            }
            bo.flush();
            System.out.println("upload success");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                ss.close();
            } catch (IOException e) {
                System.out.println("close failed");
            }
        }

    }
}

问题是您忽略了读取的字节数:

while((bi.read(bys))!=-1){
  bo.write(bys);
}
这意味着您总是向
bo
写入1024个字节,即使从
bi
读取的字节少于1024个

您需要将读取的字节数分配给变量,并将其传递给write调用:

int bytesRead;
while((bytesRead = bi.read(bys))!=-1){
  bo.write(bys, 0, bytesRead);
}

请按如下方式填写您收到的准确字节

        int len= 0 ;
        while( ( len = bi.read(bys))!=-1){
            bo.write(bys,0, len);
        }

客户端和服务器端都需要相同的代码更改。我在最后进行了测试,发现这两个文件在更改后大小相同

您的服务器代码总是将BY数组的全长写入输出流

正确的方法:

byte [] bys =new byte[1024];
while(true) {
  int numRead = bs.read(bys);
  if (numRead == -1)
   break;
   bo.write(bys, 0, numRead);
}

这不是正确的方法,它不会编译。