[JAVA]probleme socket
pafpaf
-
el_linwin Messages postés 517 Date d'inscription Statut Membre -
el_linwin Messages postés 517 Date d'inscription Statut Membre -
Bonjour,
je suis en train de développer un petit jeu en réseau, pour le moment je me contente d'un unique client, mais je bloque déjà.
En gros, a chaque action que l'on execute coté client, ça envoi une requete au serveur qui renvoi un résultat au client.
code serveur:
public class Serveur extends JFrame{
static final int port = 2345;
static ArrayList<Grille> monde = new ArrayList<Grille>();
static Grille gri1 = new Grille(10,10,1);
static Grille gri2 = new Grille(10,10,2);
static ServerSocket s;
static Socket soc;
static PrintWriter ecriture;
static BufferedReader lecture;
public Serveur()
{
setVisible(true);
setSize(200,200);
setTitle("Serveur");
}
public void lancement() throws Exception
{
s = new ServerSocket(port);
System.out.println("Lancement réussi");
soc = s.accept();
lecture = new BufferedReader(new InputStreamReader(soc.getInputStream()));
ecriture = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())),true);
ecoute();
}
public void ecoute() throws Exception
{
while(true)
{
String phrase = lecture.readLine();
String mots[]=phrase.split("-");
if (mots[0].equals("end")) break;
else if(mots[0].equals("niveau"))get_map(Integer.parseInt(mots[1]));
}
}
public static void get_map(int a)
{
for(Grille temp : monde)
{
for(int i=0;i<temp.getHauteur();i++)
{
for(int j=0;j<temp.getLargeur();j++)
{
if(temp.getPlateau()[i][j].get_contenu()==a)ecriture.println("niveau-"+temp.getNumero());
}
}
}
}
}
code client:
public class Client extends JFrame {
static final int port = 2345;
static int numero = 1;
static int niveau = -1;
static Socket socket;
static PrintWriter ecriture;
static BufferedReader lecture;
static JButton send = new JButton("Send");
static JLabel j = new JLabel("test");
public Client()
{
setVisible(true);
setSize(200,200);
setTitle("Client");
add(j);
setLayout(null);
j.setBounds(50,50,50,50);
send.setVisible(true);
send.addMouseListener(new Bouton(this));
getContentPane().add(send);
send.setBounds(50,100,100,30);
send.setFocusable(false);
}
public void connexion() throws Exception
{
socket = new Socket("127.0.0.1", port);
System.out.println("Connexion établie\n");
ecriture = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
lecture = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ecoute();
}
public void ecoute() throws Exception
{
while(true)
{
String phrase = lecture.readLine();
String mots[]=phrase.split("-");
if (mots[0].equals("end")) break;
else if(mots[0].equals("niveau"))
{
niveau=Integer.parseInt(mots[1]);
j.setText(""+niveau);
j.repaint();
this.repaint();
}
}
}
public void niveau()
{
ecriture.println("niveau-"+numero);
}
public void get_niveau()
{
System.out.println("\n "+niveau);
}
}
Donc la rien de particulier, 2 interface, celle du client possede un bouton qui permet de lancer la methode niveau(),
le probleme c'est qu'aparament la boucle d'écoute fait "ramer" le client a tel point que je n'arrive pas a utiliser les méthodes. et sans la boucle d'écoute, le cient se déconnecte du serveur.
j'espere avoir été assez clair.
merci pour votre aide.
je suis en train de développer un petit jeu en réseau, pour le moment je me contente d'un unique client, mais je bloque déjà.
En gros, a chaque action que l'on execute coté client, ça envoi une requete au serveur qui renvoi un résultat au client.
code serveur:
public class Serveur extends JFrame{
static final int port = 2345;
static ArrayList<Grille> monde = new ArrayList<Grille>();
static Grille gri1 = new Grille(10,10,1);
static Grille gri2 = new Grille(10,10,2);
static ServerSocket s;
static Socket soc;
static PrintWriter ecriture;
static BufferedReader lecture;
public Serveur()
{
setVisible(true);
setSize(200,200);
setTitle("Serveur");
}
public void lancement() throws Exception
{
s = new ServerSocket(port);
System.out.println("Lancement réussi");
soc = s.accept();
lecture = new BufferedReader(new InputStreamReader(soc.getInputStream()));
ecriture = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())),true);
ecoute();
}
public void ecoute() throws Exception
{
while(true)
{
String phrase = lecture.readLine();
String mots[]=phrase.split("-");
if (mots[0].equals("end")) break;
else if(mots[0].equals("niveau"))get_map(Integer.parseInt(mots[1]));
}
}
public static void get_map(int a)
{
for(Grille temp : monde)
{
for(int i=0;i<temp.getHauteur();i++)
{
for(int j=0;j<temp.getLargeur();j++)
{
if(temp.getPlateau()[i][j].get_contenu()==a)ecriture.println("niveau-"+temp.getNumero());
}
}
}
}
}
code client:
public class Client extends JFrame {
static final int port = 2345;
static int numero = 1;
static int niveau = -1;
static Socket socket;
static PrintWriter ecriture;
static BufferedReader lecture;
static JButton send = new JButton("Send");
static JLabel j = new JLabel("test");
public Client()
{
setVisible(true);
setSize(200,200);
setTitle("Client");
add(j);
setLayout(null);
j.setBounds(50,50,50,50);
send.setVisible(true);
send.addMouseListener(new Bouton(this));
getContentPane().add(send);
send.setBounds(50,100,100,30);
send.setFocusable(false);
}
public void connexion() throws Exception
{
socket = new Socket("127.0.0.1", port);
System.out.println("Connexion établie\n");
ecriture = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
lecture = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ecoute();
}
public void ecoute() throws Exception
{
while(true)
{
String phrase = lecture.readLine();
String mots[]=phrase.split("-");
if (mots[0].equals("end")) break;
else if(mots[0].equals("niveau"))
{
niveau=Integer.parseInt(mots[1]);
j.setText(""+niveau);
j.repaint();
this.repaint();
}
}
}
public void niveau()
{
ecriture.println("niveau-"+numero);
}
public void get_niveau()
{
System.out.println("\n "+niveau);
}
}
Donc la rien de particulier, 2 interface, celle du client possede un bouton qui permet de lancer la methode niveau(),
le probleme c'est qu'aparament la boucle d'écoute fait "ramer" le client a tel point que je n'arrive pas a utiliser les méthodes. et sans la boucle d'écoute, le cient se déconnecte du serveur.
j'espere avoir été assez clair.
merci pour votre aide.
Configuration: Windows XP Internet Explorer 7.0
3 réponses
-
Bonjour pafpaf,
D'après ce que je vois, ce sont surtout les appels à:
j.repaint();
this.repaint();
qui me semblent faire ramer le système. Les méthodes repaint() sont assez gourmandes en ressources.
Cordialement,
el_linwin -
je me sens honteu, mais en fait le probleme ne venait pas de la connexion , j'avais oublié de réécrire l'initialisation du serveur, donc il ne trouvé jamais le résultat ^^
désolé pour le dérangement, et merci de ton conseil el_linwin -
Bonsoir pafpaf,
Ah, oui, effectivement, si le serveur ne s'initialise pas... il y a un problème.
Ce n'est pas grave, l'important est que tu aies trouvé !
Bonne soirée !
Cordialement,
el_linwin