首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的是,服务器接收的数据比我从客户端获得的种子还要多。

奇怪的是,服务器接收的数据比我从客户端获得的种子还要多。
EN

Stack Overflow用户
提问于 2016-04-11 08:02:42
回答 3查看 37关注 0票数 2

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

客户

代码语言:javascript
复制
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");
            }
        }
    }
}

服务器

代码语言:javascript
复制
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");
            }
        }

    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-11 08:17:58

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

代码语言:javascript
复制
while((bi.read(bys))!=-1){
  bo.write(bys);
}

这意味着您始终将1024字节写入bo,即使从bi读取的字节少于1024字节。

您需要将读到的字节数分配给一个变量,并将其传递给写调用:

代码语言:javascript
复制
int bytesRead;
while((bytesRead = bi.read(bys))!=-1){
  bo.write(bys, 0, bytesRead);
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-11 08:19:43

请写正确的字节,您收到的如下

代码语言:javascript
复制
        int len= 0 ;
        while( ( len = bi.read(bys))!=-1){
            bo.write(bys,0, len);
        }

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

票数 0
EN

Stack Overflow用户

发布于 2016-04-11 08:22:26

您的服务器代码总是将完整长度的bys数组写入输出流。

正确的方法:

代码语言:javascript
复制
byte [] bys =new byte[1024];
while(true) {
  int numRead = bs.read(bys);
  if (numRead == -1)
   break;
   bo.write(bys, 0, numRead);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36543032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档