Problème ping + lancement (ou arret) programme (fini]

j ai essaye egalement ms ca fonctionne pas


le thread ne démarre pas du tout en fait

alors en fait j ai l impression qil démarre mal…du moins pas complètement

avec ca:
Thread thread2 = (new Thread(){ public void run() {
try{ new Forwarder(“192.168.120.251”, 2050, 2051); }
catch (IOException e){ e.printStackTrace(System.err);} }});
thread2.start();

il démarre…pas complètement c est bizarre, il reste plus ou moin coincé j ai l impression

et avec ca:
Thread thread2 = (new Thread(){ public void run() {
try{ Forwarder.main(new String[]{“192.168.120.251”, “2050”, “2051”}); }
catch (IOException e){ e.printStackTrace(System.err);} }});
thread2.start();

il démarre bien…mais les ports sont incorrects

tu as oublié le .start() (ce qui me fait dire que ça doit être un Thread.
Est-ce que tu as des message d’erreur?
Est-ce que tu as essayé en pas à pas sous Eclipse?

nicket, j ai fait d’autres essais ce week end et c’était bien .start() qui manquait :slight_smile:

j ai déclaré sur le meme principe dans ThreadPing le nouvea thread ce qui a donné:


 import java.io.IOException;
import java.net.InetAddress;
import java.util.Properties;

import ticket.TicketController;


 
public class ThreadPing extends Thread 
{
	private String nom  ;
	private boolean pingOK = false ;
	private final int tpsTimeOut = 2000;
	private Thread otherThread;
	private Thread otherThread2;
	
	public ThreadPing(String nomMachineATester, Thread anotherThread ,Thread anotherThread2)
	{
		this.nom = nomMachineATester ;
		this.otherThread = anotherThread;
		this.otherThread2 = anotherThread2;
	}
	
	public void run()
	{
		try{
			InetAddress i = InetAddress.getByName(nom);
			pingOK = i.isReachable(this.tpsTimeOut);
			if(pingOK)
				{
				System.out.println(this.nom +" => OK");
				}
			else
			{
				
				System.out.println(this.nom +" => ECHEC !!!");
				
				
				/*
		        Properties sys = System.getProperties();
		        String os = sys.getProperty("os.name");
		        Runtime r = Runtime.getRuntime();
		        if (os.endsWith("2000"))
		        	{
		        	thread.interrupt();
		        	}
			        else
			        	r.exec("taskkill javaw");
			        	*/

				otherThread.interrupt();
				otherThread2.interrupt();
				Thread.sleep(120000);

				 Thread thread = (new Thread(){public void run(){ticket.TicketController.main(new String[]{"arg0","arg1"});}});   //modif
				 thread.start();
				 Thread thread2 = (new Thread(){ public void run() {
					 try{ (new Forwarder("192.168.120.251", 2050, 2051)).start(); }
					 catch (IOException e){ e.printStackTrace(System.err);} }});
					 thread2.start();
			}
			}
		catch(Exception e)
		{
			e.printStackTrace();}

		
	}
	
	public boolean isPingOk()
	{
		return this.pingOK ;
	}
}
 

mais quand je lance l’ensemble pas de soucis tout démarre, maiq audn je provoque un problème le “thread2” n’est pas redemarré (il est meme pas stoppé en fait) et j’obtiens ceci:

http://telephonie.ath.cx/console.jpg
Edité le 13/08/2007 à 09:28

Quand même, je trouve ça bourrin de faire appel à un exec pour killer un processus nommé javaw quant on sait que c’est le même exécutable utilisé pour Eclipse, jEdit, n’importe quel truc en java, …

Si tu veux lancer des processus, ok, mais si tu veux les killer, utilise la méthode java.lang.Runtime.destroy() :

java.sun.com…

Ca saura d’autant mieux que tu crée tes processus avec exec, donc autant les tuer de cette façon - propre.

cette partie la est en commentaire et donc le code actuel ne l’utilise plus du tout, je ne l’ai pas encore complètement supprimé mais je pense que ca va plus tarder :slight_smile:
Edité le 13/08/2007 à 10:36

qu en pensez vous?

“Address already in use”: tu tente d’ouvrir le même NO de socket sur la même IP ce qui est impossible
“Connection reset”: à priori, c’est le programme “en face” qui a coupé avant toi.

et comment stopper ce programme (Forwarder) alors de façon claire pour pouvoir en relancer une nouvelle instance?

et d’ailleurs peut on l’arreter?

normalement oui, mais ça dépend comment il est fait.

mais là ça ressemble plus à une verrue pour débugger le programme Forwarder, ce ne serais pas plus simple qu’il reste en marche et tente de se reconnecter si erreur, ou alors qu’il termine tout seul?

j ai réussi a bien localiser la partie qui posait problème du forwarder:


           System.out.println("[Forwarder] Forwarding data from remote host to clients...");
             try
             {
                 byte b[] = new byte[4096];
                 int c;
                 while ((c = remote.getInputStream().read(b)) != -1)
                 {
                     for (Iterator i = clients.iterator(); i.hasNext();)
                     {
                         ForwarderClient client = (ForwarderClient) i.next();
                         client.getClient().getOutputStream().write(b, 0, c);
                     }
                 }
                 server.close();
                 remote.close();
             }
             catch (IOException e)
             {
                 e.printStackTrace();
             }

c est au niveau du While. le getinputstream doit détecter un problème mais a cause du while il ne sort pas de la boucle et reste en attente d’information.

d’après ce que j ai vu dans la doc du getinputstream on peut lui mettre une exception (java.lang.IllegalStateException)…mais ca n’aura aucun incidence puisque la c est dans une boucle.


peut t on mettre dans le while une indication d'erreur qui lui permettrait de tout quitter le thread?
peut on meme tester "java.net.SocketException" puisque c est lui qui détecte le reset de la connexion?

rebonjour tout le monde,

tout fonctionne! eh oui j ai par trouver ce qui manquait…c est a dire pas grand chose je dois dire.

En rélité dorenavant j ai suivi ton idée deltree, c est Firwarder qui se ferme et se relance et lance ticketcontroller

Le ping est utilisé dans le programme client et n’utilise pas forwarder donc lui marche sans souci aucun :wink:

merci beaucoup!