3

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 的名称,但我不知道发生了什么以及如何解决它

4

2 回答 2

1

问题是方法writeUTF

javadoc说:

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

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

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

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

于 2014-02-17T22:34:46.220 回答
0

服务器发送这个:

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

其次是文件。

客户读到:

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

其次是文件。

因此,您正在阅读filesCount您根本没有发送的内容,而不是阅读fileName您正在发送的内容。那么它怎么可能起作用呢?

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

于 2014-02-18T06:36:01.440 回答