我发送了一个大约500 is的图像,但是在服务器上,接收到的图像超过500 is,我想知道我是否有什么逻辑上的问题?网络的速度约为100 is /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");
}
}
}
}发布于 2016-04-11 08:17:58
问题是,您忽略了读取的字节数:
while((bi.read(bys))!=-1){
bo.write(bys);
}这意味着您始终将1024字节写入bo,即使从bi读取的字节少于1024字节。
您需要将读到的字节数分配给一个变量,并将其传递给写调用:
int bytesRead;
while((bytesRead = bi.read(bys))!=-1){
bo.write(bys, 0, bytesRead);
}发布于 2016-04-11 08:19:43
请写正确的字节,您收到的如下
int len= 0 ;
while( ( len = bi.read(bys))!=-1){
bo.write(bys,0, len);
}客户端和服务器端都需要进行相同的代码更改。我在最后进行了测试,发现在此更改后,这两个文件的大小相同。
发布于 2016-04-11 08:22:26
您的服务器代码总是将完整长度的bys数组写入输出流。
正确的方法:
byte [] bys =new byte[1024];
while(true) {
int numRead = bs.read(bys);
if (numRead == -1)
break;
bo.write(bys, 0, numRead);
}https://stackoverflow.com/questions/36543032
复制相似问题