Java MulticastSocket setSoTimeout останавливает программу - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь использовать мультикастокеты в моей программе.Сегодня я не уверен, что изменилось, но моя программа (которая раньше не работала и работала нормально) начала случайным образом зависать при вызове метода setSoTimeout(int).Это не всегда, метод может быть вызван несколько раз, прежде чем это произойдет.Любые подсказки относительно того, что это такое?

Код:

private String[] getPlayerInfo() {
    sendMessageToPlayers("count", 500);
    String[] temp = new String[4];
    while (true) {
        try {
            byte[] buffer = new byte[1000];
            DatagramPacket datagram = new DatagramPacket(buffer, buffer.length);
            cSocket.receive(datagram);
            String message = new String(datagram.getData());
            if (message.contains("received")) {
                message.substring(message.indexOf("received") - 1, 1);
                int playerNum = Integer.parseInt(message.substring(message.indexOf("received") - 1, 1));
                temp[playerNum] = message.substring(message.indexOf("received") + "received ".length());
            }
        } catch (IOException e) {
            try {
                cSocket.setSoTimeout(100000);
            } catch (SocketException e1) {
                break;
            }
            break;
        }
    }
    return temp;
}

public void sendMessageToPlayers(String message, int timeout) {
    byte[] buf = (message).getBytes();
    DatagramPacket dg = new DatagramPacket(buf, buf.length, group, 6789);
    try {
        cSocket.send(dg);
        cSocket.setSoTimeout(timeout);
    } catch (IOException ex) {
        System.out.println(ex);
    }
}

1 Ответ

0 голосов
/ 12 ноября 2018

В документации setSoTimeout есть

Включить / отключить SO_TIMEOUT с указанным тайм-аутом в миллисекундах. Если для этой опции задано ненулевое время ожидания, вызов read () InputStream, связанный с этим сокетом, будет блокироваться только для этого количество времени. Если время ожидания истекло, java.net.SocketTimeoutException повышен, хотя Сокет все еще действительный. Опция должна быть включена до входа в блокировку операция, чтобы иметь эффект. Тайм-аут должен быть> 0. Тайм-аут нулевой интерпретируется как бесконечный тайм-аут.

И SO_TIMEOUT

Установить тайм-аут при блокировке операций с сокетом:

  • ServerSocket.accept ()
  • SocketInputStream.read ()
  • DatagramSocket.receive () * * тысяча двадцать-один

Опция должна быть установлена ​​до ввода операции блокировки, чтобы эффект. Если время ожидания истекло, и операция продолжит блок, java.io.InterruptedIOException повышается. Разъем не закрыто в этом случае.

Я не понимаю, как вы его использовали.

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