DataInputStream readLong()获取错误的值

时间:2014-02-17 22:29:37

标签: java sockets datainputstream dataoutputstream

嗨我用readLong() DataInputStream.方法遇到了一些麻烦当我通过DataOutputStream.writeLong()输入一个值时,它是正确的值,但是当它被发送时它会更大应该是,我将代码全部放在一个可运行的语句中,以便程序不会冻结

这是客户

    socket = new Socket(ipAddress, Port);

    bos = new BufferedOutputStream(socket.getOutputStream());
    dos = new DataOutputStream(bos);

    File f = new File("C:/Users/lukeLaptop/Downloads/RemoveWAT22.zip");

    long length = f.length();
    dos.writeLong(length);

    String name = f.getName();
    dos.writeUTF(name);

    FileInputStream fis = new FileInputStream(f);
    bis = new BufferedInputStream(fis);

    int theByte = 0;
    while ((theByte = bis.read()) != -1) {
        bos.write(theByte);
    }
    bis.close();

    dos.close();

服务器端

    ServerSocket server = new ServerSocket(8080);

    while (true) {
        socket = server.accept();

        System.out.println("Got a client !");

        bis = new BufferedInputStream(socket.getInputStream());

        dis = new DataInputStream(bis);

        int filesCount = dis.readInt();



        long fileLength = dis.readLong();
        //String fileName = dis.readUTF();

        File f = new File("C:/test/here/test.zip");

        FileOutputStream fos = new FileOutputStream(f);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        for (int j = 0; j < fileLength; j++) {
            bos.write(bis.read());
        }

        bos.close();
        dis.close();

修改

如果任何人可以帮助我使用代码,我非常感谢我是套接字的新手,我对事情感到有些困惑,我想要的是使用dataoutputstream的writeLong方法发送文件的长度并使用writeUTF发送名称,但我不知道发生了什么以及如何解决它

2 个答案:

答案 0 :(得分:1)

问题是方法writeUTF

javadoc说:

  

使用修改后的UTF-8将字符串写入基础输出流   以与机器无关的方式进行编码。

     

首先,将两个字节写入输出流,就好像通过   writeShort方法给出要遵循的字节数。这个值是   实际写出的字节数,而不是长度   串。在长度之后,输出字符串的每个字符,   按顺序,使用修改后的UTF-8编码作为字符。如果   抛出没有异常,写入的计数器增加了   写入输出流的总字节数。这将是   至少两加上str的长度,最多加两次加三次   str的长度。

但是你使用自己的长度编码,只需要字符串包含的字符数。它不使用字符串的编码长度。

如果使用DataInputStream.readUTF()来读取字符串,则不必使用自己的长度编码。

答案 1 :(得分:0)

服务器发送:

dos.writeLong(length);
dos.writeUTF(name);

后跟文件。

客户读到这个:

int filesCount = dis.readInt();
long fileLength = dis.readLong();
//String fileName = dis.readUTF();

后跟文件。

因此,您正在阅读一个您根本没有发送的filesCount,而不是正在阅读您要发送的fileName。那怎么可能有用呢?

如果您没有准确地阅读您发送的内容,使用补充方法,它将无效。