Threads et connection

OmEn -  
 OmEn -
Voilà mon problême : je voudrais créer un prog' en java qui lance un thread qui se connecte à un hôte puis l'endormir et le réactiver quand l'utilisateur veut envoier une demande, recevoire la réponse puis se réendormir et ainsi de suite. Voici mon prog', il est un peu long mais bon... :

import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class TrivialApplication
{
public static void main(String[] args)
{
OmenFrame frame = new OmenFrame();
frame.show();
}
}
public class OmenFrame extends Frame implements ActionListener
{
TextField address;
Button connect;
TextArea message;
TextArea response;
public OmenFrame()
{
setTitle("The Omen Connecter");
setSize(300, 400);
setLocation(50, 50);
setResizable(false);
setLayout(new FlowLayout());

s = new OmenThread("127.0.0.1", 21);

address = new TextField("", 32);
connect = new Button("Envoier");
message = new TextArea(8, 40);
response = new TextArea(16, 40);

add(address);
add(connect);
add(message);
add(response);

setBackground(Color.gray);
setForeground(Color.black);
address.setBackground(Color.white);
connect.setBackground(Color.white);
message.setBackground(Color.white);
response.setBackground(Color.white);
repaint();

Font font = new Font("Monaco", Font.PLAIN, 10);
address.setFont(font);
connect.setFont(font);
message.setFont(font);
response.setFont(font);

response.setEditable(false);

connect.addActionListener(this);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(!s.getParam().equals(address.getText())) s = new OmenThread(address.getText().substring(0, address.getText().indexOf(":")), toNumbers(address.getText().substring(address.getText().indexOf(":") + 1, address.getText().length())));
else
{
s.WakeUp();
response.append(s.Write(message.getText()));
response.append(s.Read());
s.Sleep();
}
}
OmenThread s;
public int toNumbers(String line)
{
int num = 0;
boolean more = true;
int i = 1;
while(i < 65535)
{
if(line.equals("" + i + ""))
{
num = i;
break;
}
else i++;
}
return num;
}
}
public class OmenThread extends Thread
{
String host;
int port;
Socket s;
boolean sleepy;
public OmenThread(String ihost, int iport)
{
host = ihost;
port = iport;
}
public void run()
{
try
{
s = new Socket(host, port);
sleepy = true;
while(true) Sleeping();
}
catch(IOException i)
{
}
catch(InterruptedException i)
{
}
}
public String Read()
{
String response = "";
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while((line = in.readLine()) != null)
{
response += "" + line + "\r";
}
}
catch(IOException i)
{
}
return response;
}
public String Write(String message)
{
String response = "";
System.out.println(message);
try
{
BufferedReader text = new BufferedReader(new StringReader(message));
PrintWriter out = new PrintWriter(s.getOutputStream());
String mes;
while((mes = text.readLine()) != null)
{
out.println(mes);
out.flush();
response += "" + mes + "\r";
}
}
catch(IOException i)
{
}
return response;
}
public synchronized void Sleeping() throws InterruptedException
{
while(sleepy) s.wait();
}
public void Sleep()
{
sleepy = true;
}
public synchronized void WakeUp()
{
sleepy = false;
s.notify();
}
public String getParam()
{
return host + ":" + port;
}
}

Vous seriez vraiment sympa de m'expliquer pourquoi cela ne marche pas.

OmEn [i2n]

PS: j'ajouterait que je l'ai fait de mes mains donc merci de ne pas le réutiliser.

14 réponses

ariock Messages postés 125 Statut Membre 5
 
Pour commencer si ca marche pas je vois pas pourquoi on copierais hein...
Ensuite comme tu dis c'est un peu long alors si tu disais un peu ce que ca veux dire "ca marche pas"...

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
1
OmEn
 
De copier le prog' une fois les modifications faites. Et ca me renvoie une NullPointerException.

OmEn
0
OmEn
 
Plus précisement :

Exception occurred during event dispatching:
java.lang.NullPointerException
at OmenThread.WakeUp(TrivialApplication.java:170)
at OmenFrame.actionPerformed(TrivialApplication.java:71)
at java.awt.Button.processActionEvent(Button.java)
at java.awt.Button.processEvent(Button.java)
at java.awt.Component.dispatchEventImpl(Compiled Code)
at java.awt.Component.dispatchEvent(Compiled Code)
at java.awt.EventDispatchThread.run(EventDispatchThread.java)
0
ariock Messages postés 125 Statut Membre 5
 
OK j'ai trouve...
A la ligne 68 tu fait un teste

if(s.getParam()) s = new ...

--> d'accord, mais pour tester il faut que l'object existe...

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
OmEn
 
Trop cool ! T'es peut-être contrariant au début mais après...

OmEn

Merci encore !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
OmEn
 
Est-ce que ca marcherait :

if(s) if(!s.getParam().equals(address.getText())) s = new OmenThread(address.getText().substring(0, address.getText().indexOf(":")), toNumbers(address.getText().substring(address.getText().indexOf(":") + 1, address.getText().length())));

Sinon comment savoir si l'objet existe ?

OmEn
0
OmEn
 
Mais pourtant il est initialisé au début...
0
ariock Messages postés 125 Statut Membre 5
 
Oui, pour tester si l'object existe tu peux faire comme ca...
Si il est initialiser au debut c'est peut-etre pas l'erreur...

Mais bon ca contribue de toute facons...
Pourquoi tu veux re-creer une object s si il est initialiser au debut?

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
OmEn
 
Au cas ou il a changé les paramètre comme le nom d'hôte ou le port.

OmEn
0
ariock Messages postés 125 Statut Membre 5
 
OK compris... ben ecoute sans teste sur ma machine je sais pas vraiment faire plus, mais essaye de decompser cette methode la en plein de petits bou et de mettre du debug partout pour voir ou ca coince

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
OmEn
 
Mon debugger plante mais je vais reessayer.
0
ariock Messages postés 125 Statut Membre 5
 
Oublie le debugger, met des System.err.println(""); partout dans ton code et voi ou ca s'arrette... les debugger c'est joli mais ca aide pas toujours...

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
OmEn > ariock Messages postés 125 Statut Membre
 
Eh... t'es plus là ? S'il te plait, répond-moi.


OmEn
0
OmEn
 
Ca bug sur le s.notify de la méthode WakeUp().

OmEn
0
ofournier.cbd Messages postés 5862 Date d'inscription   Statut Membre Dernière intervention   84
 
T'inquiètes, il reviendra mais n'oublies pas qu'on est presque tous
bénévoles ici et qu'un peu de patience ne fait pas de mal.

Le gaucher c'est un étudiant en Grèce, alors tu vois ...

S'il ne se manifeste pas dans un ou deux jours, demandes le au
café d'à côté.

Mais pas 12 annonces, les modos (et les fidèles) n'aiment pas ça !

Je drague pas, je marivaude ...
0
ariock
 
Il a raison, je suis de retour...

Bon pour ton s.notify().... j'ai du mal j'avoue a suivre exactement toute ta logique, mais normallement ds mes souvenir (pas bien vieux mais quand meme) le notify ne devrait pas etre fait par la classe que ca doit reveiller...

Et si tu l'enleve tout betement ca donne quoi?
0
OmEn
 
Merci beaucoup, ca marche mieux mais maintenant ca me renvoie une NullPointerException dans la méthode Write(). Au moins l'autre problême est passé et j'ai corrigé la ligne :

if((s == null) || (!s.getParam().equals(address.getText()))) s = new OmenThread(address.getText().substring(0, address.getText().indexOf(":")), toNumbers(address.getText().substring(address.getText().indexOf(":") + 1, address.getText().length())));

Pour avoir plus de chance.

@+

OmEn [i2n]
www.i-2n.net
0
OmEn
 
Je vais aussi mettre un notify() dans la classe qui appele la fonction WakeUp().

OmEn
0
OmEn
 
C'est la ligne :

PrintWriter out = new PrintWriter(s.getOutputStream());

qui renvoie une NullPointerException ... Pourquoi ?

OmEn
0
OmEn
 
J'en ai vraiment besoin ! Aidez-moi !
0