Я работаю над приложениями для сокетов на основе UDP, и здесь у меня есть несколько вопросов о том, как реализовать функцию прослушивания на принимающей стороне.
Ниже приведен хороший способ позволить сокету на стороне приема продолжать прослушивание на стороне сервера? Предположим, я не знаю, когда серверная сторона отправит пакет на принимающую сторону, поэтому мне нужно, чтобы функция приема всегда была включена. Будет ли он пропущен или каким-то образом сломается цикл while (true)? Если да, то как «повторно подключиться» и снова оживить цикл прослушивания?
while(true){ try{ if ( udpsocket_receiving.isClosed() || !udpsocket_receiving.isConnected() ) { serverAddress = InetAddress.getByName(SERVERIP); udpsocket_receiving = new MulticastSocket(SERVERPORT) ; udpsocket_receiving.joinGroup(serverAddress); udpsocket_receiving.setSoTimeout(10000); } udpsocket_receiving.receive(recpacket); // Block of code to do with the packet } catch ( SocketTimeoutException e ) { // What suppose to do here if I catch this exception? } finally { udpsocket_receiving.close(); continue; } }
Может ли вышеописанный метод уже решить, если у меня нет доступа в Интернет в течение определенного времени, предположим, что метод всегда будет перехватывать правильное исключение SocketTimeoutException? Но когда доступ в Интернет возобновится позже, смогу ли я продолжить прослушивание, когда придет пакет?
Предположим, я получил первый пакет от отправителя и выполнил код, но отправитель отправил второй пакет в это время, я пропущу пакет? Так как цикл while на первом пакете не заканчивается.
Ниже приведен хороший подход, чтобы вручную закрыть сокет и «повторно подключить» его снова? Будет ли он каким-то образом связывать порт и не сможет снова использовать тот же порт для нового объекта? И если это блок правильного кода, я должен поместить их внутрь
SocketTimeoutException
в вопросе один?udpsocket_receiving.leaveGroup(serverAddress); udpsocket_receiving.disconnect(); udpsocket_receiving.close(); udpsocket_receiving = new MulticastSocket(SERVERPORT) ; udpsocket_receiving.setSoTimeout(10000); udpsocket_receiving.joinGroup(serverAddress);