У меня есть Java-код, с помощью которого я загружаю письма с Outlook Exchange Server. Проблема, с которой я столкнулся: если подключение к Интернету не работает, выполнение программы прекращается.Проверка подключения к Интернету в java
Я хочу, чтобы код проверялся на подключение к интернету до тех пор, пока соединение не будет доступно. Я не хочу, чтобы выполнение остановилось, если интернет отключен.
Несколько решений для проверки подключения к Интернету находятся в переполнении стека, но если я использую это решение, через некоторое время я получу ошибку stackoverflow.
private static void checkNetConnectivity()
{
Socket sock = new Socket();
InetSocketAddress addr = new InetSocketAddress("www.google.com",80);
try{
sock.connect(addr,3000);
System.out.println("connected");
}catch(Exception e){
System.out.println("not connected");
}
}
Я вызываю метод из следующей функции:
public static void downloadEmails(String protocol, String host, String port, String username, String password)
{
Properties props = new Properties();
Folder inbox = null;
MimeBodyPart bp = null;
String mail_subject = null, mail_body = null;
int i;
props.setProperty("mail.store.protocol", "imaps");
//props.put("mail.pop3.host", host);
//props.put("mail.pop3.port", port);
//props.put("mail.pop3.starttls.enable", "true");
try
{
do
{
checkNetConnectivity();
Session session = Session.getInstance(props);
//session.setDebug(true);
Store store = session.getStore(protocol);
store.connect(host, username, password);
inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);// READ_WRITE mode is compulsory if you want to set the SEEN flag.
cnt = 0;
Flags seen = new Flags(Flags.Flag.SEEN);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
Message msg[] = inbox.search(unseenFlagTerm);
System.out.println("No of unseen messages : " + msg.length);
if (msg.length > 0)
{
for (i = 0; i < msg.length; i++)
{
System.out.println("Serial No :" + i);
Address[] in = msg[i].getFrom();
for (Address address : in)
{
System.out.println("FROM:" + address.toString());
//String mail_address = address.toString();
}
System.out.println("SENT DATE: " + msg[i].getSentDate());
System.out.println("SUBJECT: " + msg[i].getSubject());
mail_subject = msg[i].getSubject();
Date date = msg[i].getSentDate();
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String mail_sent_date = df.format(date);
System.out.println("Sent date = "+ mail_sent_date);
String str1[] = mail_subject.split("\\|");
int sub_delimiter_count = str1.length - 1; //count of delimiter for validating email subject
if (str1[0].equals("1001") && sub_delimiter_count == 3)
{
System.out.println("Subject line valid.");
Object content = msg[i].getContent();
if (content instanceof String)
{
String body = (String) content;
mail_body = body;
boolean isValid = new ReadMail().ValidateMail(mail_body);
if(isValid)
{
System.out.println("Email body in proper format.");
}
else
{
System.out.println("Email not in proper format.\nIgnoring...");
continue;
}
}
else if (content instanceof Multipart)
{
System.out.println("This is MultiPart");
MimeMultipart mp = (MimeMultipart) msg[i].getContent();
bp = (MimeBodyPart) mp.getBodyPart(0);
InputStream partInput = bp.getInputStream();
mail_body = new Scanner(partInput, "UTF-8").useDelimiter("\\A").next();
}
System.out.println("hhhh");
ReadEmail(mail_subject, mail_body, mail_sent_date);
}
else
{
System.out.println("Subect not in required format.\nIgnoring...");
}
msg[i].setFlag(Flags.Flag.SEEN, true); // for this to work INBOX or any FOLDER has to opened in READ_WRITE mode.
}
} else {
Date date = new Date();
System.out.println("No new messages. Last checked: "+date.toString());
}
try {
Thread.sleep(2000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
store.close();
}while(true);
}catch(Exception e)
{
e.printStackTrace();
//downloadEmails(protocol,host,port,username,password);
}
}
Это исключение я получил, когда интернет был отключен:
javax.mail.MessagingException: Нет маршрута для host: connect; вложенная исключение: java.net.NoRouteToHostException: Нет маршрута к хосту: подключения на com.sun.mail.imap.IMAPStore.protocolConnect (IMAPStore.java:670) DEBUG: setDebug: JavaMail версия 1.4.7 DEBUG: getProvider() возвращает javax.mail.Provider [STORE, imaps, com.sun.mail.imap.IMAPSSLStore, Oracle] DEBUG IMAPS: mail.imap.fetchsize: 16384 DEBUG IMAPS: mail.imap.ignorebodystructuresize: false DEBUG IMAPS: mail.imap.statuscachetimeout: 1000 DEBUG IMAPS: mail.imap.appendbuffersize: -1 DEBUG IMAPS: mail.imap.minidletime: 10 DEBUG IMAPS: пытается подключиться к хосту «outlook.office365.com», порт 993, isSSL true
на javax.mail.Service.connect (Service.java:295) при javax.mail.Service.connect (Service.java:176) при readmail.ReadMail.downloadEmails (ReadMail.java:200) в readmail.ReadMail.main (ReadMail.java:323) Вызвано: java.net.NoRouteToHostException: нет маршрута к хосту: подключитесь к java.net.DualStackPlainSocketImpl.connect0 (собственный метод) в java.net.DualStackPlainSocketImpl.socketConnect (Unknown Source) на java.net.AbstractPlainSocketImpl.doConnect (Unknown Source) в java.net.AbstractPlainSocketImpl.connectToAddress (Unknown Source) в java.net.AbstractPlainSocketImpl.connect (Unknown Source) в java.net.PlainSo cketImpl.connect (Неизвестный источник) на java.net.SocksSocketImpl.connect (Неизвестный источник) на java.net.Socket.connect (Неизвестный источник) на java.net.Socket.connect (Неизвестный источник) на com. sun.mail.util.SocketFetcher.createSocket (SocketFetcher.java:321) на com.sun.mail.util.SocketFetcher.getSocket (SocketFetcher.java:237) на com.sun.mail.iap.Protocol. (Протокол .java: 116) at com.sun.mail.imap.protocol.IMAPProtocol. (IMAPProtocol.java:115) at com.sun.mail.imap.IMAPStore.newIMAPProtocol (IMAPStore.java:685) at com. sun.mail.imap.IMAPStore.protocolConnect (IMAPStore.java:636) ... 4 еще
Любая помощь будет принята с благодарностью.
показывают, что решение, и мы поможем вам ... – epoch
'StackOverflowError', скорее всего, произойдет в неконтролируемых рекурсивных вызовов, поэтому анализ кода, чтобы увидеть где может случиться –
Что вы подразумеваете под «остановкой программы»? Сбой приложения? Если да, то какое исключение вы видите? – Alex