gpt4 book ai didi

java - DataOutputStream,它是否丢失了一些位

转载 作者:行者123 更新时间:2023-11-30 05:12:46 25 4
gpt4 key购买 nike

我正在编写一个客户端服务器应用程序,但是当它们从服务器端发送时,我在客户端没有收到相同的字节。在服务器端,我使用了 .write(bytes[]) 方法。在客户端,我使用了 .readFully(byte[]) 方法。你有什么想法吗?

发送的代码:

     System.out.println("Server got connection from " + connectionFromClient.getPort());
in = connectionFromClient.getInputStream();
OutputStream out = connectionFromClient.getOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
LicenseList licenses = new LicenseList();
String ValidIDs = licenses.getAllIDs();
System.out.println(ValidIDs);
Encryption enc = new Encryption();
//byte[] dd = enc.encrypt(ValidIDs);
byte[] dd = enc.encrypt(ValidIDs);
String tobesent = new String(dd);
//byte[] rsult = enc.decrypt(dd);
//String tt = String(rsult);
System.out.println("The sent data**********************************************");
System.out.println(dd);
String temp = new String(dd);
System.out.println(temp);
System.out.println("*************************************************************");
//BufferedWriter bf = new BufferedWriter(OutputStreamWriter(out));
dataOut.write(ValidIDs.getBytes());
dataOut.flush();
System.out.println("********Testing**************");
System.out.println("Here are the ids:::");
System.out.println(licenses.getAllIDs());
System.out.println("**********************");

客户端:

         Socket connectionToServer = new Socket("127.0.0.1", 7050);
InputStream in = connectionToServer.getInputStream();
DataInputStream dis = new DataInputStream(in);

int available = dis.available();
byte[] data = new byte[available];
// dis.readFully(data);
dis.read(data);
System.out.println("The received Data*****************************************");
System.out.println(available);
System.out.println(data);
System.out.println("***********************************************************");

最佳答案

in.available() 的合约不保证任何事情。请参阅下面的 API 摘录:

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

您的代码基本上依赖/假设发送的所有数据将立即可用,并由 in.available() 相应报告。

为了确保获得所有数据,您可以在发送方开始发送一个整数,告诉将发送多少字节:

dataOut.writeInt(theBytes.length);

然后在接收方创建数组时使用该整数:

byte[] data = new byte[dis.readInt()];
<小时/>

您发送的字节是否来自String?在这种情况下,您应该小心字符集。发送者和接收者可能有不同的默认字符集。

例如,您可以使用 str.getBytes("UTF-8")new String(bytes, "UTF-8") 来确保接收者能够解释字节按照发送者的意图发送。

关于java - DataOutputStream,它是否丢失了一些位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797581/

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