gpt4 book ai didi

java - 如何获取抛出超时异常时收到的有效负载量(Android)?

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:23 25 4
gpt4 key购买 nike

在我在 Android 中开发的应用程序中,我使用套接字 tcp 和 udp 发送数字 5 的字节。我想知道是否有可能获取在抛出 SocketTimeoutException 异常之前收到的有效负载量。我正在使用 Wi-Fi Direct 技术进行一些移动测试,因此在发送时,可能不会收到所有负载,因为对等点之前已断开连接。

另外,对于 UDP 发生数据包丢失时的情况,我想知道我收到的信息量。

为了阅读我得到的内容,我使用 readFully 和 receive。这种接收是在一个步骤或一个循环中完成的,在这个循环中我接收了大量的信息。我无法一一接收字节,因为它会很慢。

TCP 接收:

ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
DataInputStream DIS = new DataInputStream(client.getInputStream());
int tamMensaje = (100 * 1000 * 1000);
byte[] payload = new byte[tamMensaje];
DIS.readFully(payload);
int failures = 0;
for (int i = 0; i < tamMensaje; i++) {
if (payload[i] != 5) {
failures = failures + 1;
}
}
int nPayLoad = payload.length- failures;
client.close();
serverSocket.close();

UDP 接收:

DatagramSocket datagramSocket = new DatagramSocket(SERVERPORT);
byte[] buffer = new byte[1400];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
int tamMensaje = 1400 *71428;
int iteration = 71428;
for (int i = 0; i < iteration; i++) {
datagramSocket.receive(packet);
msg_received = msg_received + new String(buffer, 0, packet.getLength());
}
byte[] payload = msg_received.getBytes();
int failures = 0;
for (int i = 0; i < tamMensaje; i++) {
if (payload[i] != 5) {
failures = failures + 1;
}
}
int nPayload = payload.length- failures;
datagramSocket.close();

如果 TCP 和 UDP 发送时发生通信中断以及 UDP 没有收到应有的信息,我如何知道收到的信息量?

谢谢

最佳答案

如果您使用任何复合 readXXX() 方法,则不能,因为它们的 API 不提供任何检索它的方法。

但是,例如,int 通常是一次性发送的,例如通过 writeInt() ,即使您真的很不幸并且分段或打包将其分割,也没有什么理由可以解释为什么其中一半会比另一半早到达。这种情况有可能发生,但你必须非常不走运,而且无论如何,半个 int 都没有什么用处。

类似的考虑因素也适用于 readFully():假设您正在阅读某些内容,所有内容都应该在那里,因此其中一半没有多大用处;相反,如果需要,请不要使用 readFully()

如果您使用基本的 read() 方法,答案当然是零:在超时之前什么都没有到达

I could not receive the bytes one by one because it would be really slow.

当然,但这不是唯一的选择。使用 read(byte[]),并选择缓冲区大小,例如 8192。或者 BufferedInputStream

关于java - 如何获取抛出超时异常时收到的有效负载量(Android)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51119571/

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