gpt4 book ai didi

Java DataInputStream 长度

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:20 27 4
gpt4 key购买 nike

我正在为学校作业创建一个文件服务器应用程序。我目前拥有的是一个简单的 Client 类,它通过 TCP 发送图像,还有一个 Server 类接收图像并将其写入文件。

这是我的客户端代码

import java.io.*;
import java.net.*;

class Client {
public static void main(String args[]) throws Exception {
long start = System.currentTimeMillis();
Socket clientSocket = new Socket("127.0.0.1", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

File file = new File("hot.jpg");
FileInputStream fin = new FileInputStream(file);
byte sendData[] = new byte[(int)file.length()];
fin.read(sendData);

outToServer.write(sendData, 0, sendData.length);
clientSocket.close();

long end = System.currentTimeMillis();
System.out.println("Took " + (end - start) + "ms");
}
}

这是我的服务器代码。

import java.io.*;
import java.net.*;

class Server {
public static void main(String args[]) throws Exception {
ServerSocket serverSocket = new ServerSocket(6789);
Socket connectionSocket = serverSocket.accept();
DataInputStream dis = new DataInputStream(connectionSocket.getInputStream());

byte[] receivedData = new byte[61500]; // <- THIS NUMBER

for(int i = 0; i < receivedData.length; i++)
receivedData[i] = dis.readByte();

connectionSocket.close();
serverSocket.close();

FileOutputStream fos = new FileOutputStream("received.jpg");
fos.write(receivedData);
fos.close();
}
}

我的问题是如何获取正在发送的文件的大小。如果您检查 Server 代码,您会看到我已经硬编码了这个数字,即此刻的 61500。如何动态检索此号码?

或者,我做错了吗?有什么替代解决方案?

最佳答案

在发送文件之前添加一个“长度字段”。 (请注意,由于您将文件读取到内存中,因此文件的最大大小可能约为 2GB。)


在发送文件之前写入文件的长度:

  outToServer.writeInt(sendData.length);

并且在接收时首先读取长度并将其用作长度:

  int dataLength = dis.readInt()
byte[] receivedData = new byte[dataLength];

更好的方法是首先将文件读入内存,而是直接从FileInputStream 传输它——这样您就可以传输更大的文件!

关于Java DataInputStream 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com