Как я могу получить количество полезной нагрузки, полученной при возникновении исключения тайм-аута (Android)? - PullRequest
0 голосов
/ 01 июля 2018

В приложении, которое я разрабатываю для Android, я отправляю байты с номером 5, используя сокеты tcp и udp. Я хотел бы знать, возможно ли получить объем полезной нагрузки, который был получен до тех пор, пока не было сгенерировано исключение SocketTimeoutException. Я выполняю некоторые подвижные тесты с технологией Wi-Fi Direct, поэтому при отправке все может быть не получено, поскольку одноранговые ранее отключены.

Также для случая UDP, когда происходит потеря пакета, я хотел бы знать объем информации, которую я получаю.

Чтобы прочитать, что я получаю, я использую readFully и получаю. Этот прием осуществляется за один шаг или в цикле, в котором я получаю большое количество информации. Я не мог получить байты один за другим, потому что это было бы очень медленно.

TCP RX:

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 RX:

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 не получает все, что должен?

Спасибо

1 Ответ

0 голосов
/ 01 июля 2018

Нельзя, если вы используете какой-либо из составных readXXX() методов, поскольку их API не предоставляют никаких средств для его извлечения.

Однако, как, например, int обычно отправляется за один раз, например к writeInt() действительно есть небольшая причина, почему половина из них прибыла бы задолго до другой половины, даже если вам действительно не повезло, и сегментация или пакетизация разбили ее. Это может произойти, но вам действительно нужно быть чрезвычайно неудачником, и в любом случае половина int не более полезна, чем ничего из этого.

Аналогичные соображения применимы и к readFully(): предположительно, вы читаете что-то, все, что должно быть там, поэтому половина этого не будет иметь большого смысла; и наоборот, если это так, не используйте readFully().

Если вы используете базовый метод read(), ответ, конечно же, равен нулю: ничего не получено до истечения времени ожидания.

Я не мог получить байты один за другим, потому что это было бы очень медленно.

Конечно, но это не единственная альтернатива. Используйте read(byte[]) с выбранным размером буфера, скажем, 8192. Или BufferedInputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...