Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion Client Serveur par Socket avec Runnable

Sujet résolu
    22 mai 2011 à 18:25:18

    Bonjour,

    Je cherche à créer un serveur socket ou plusieurs clients sockets peuvent se connecter pour jouer ensemble.
    A l'aide des tutoriels, j'ai réussi à faire un premier jet concluant, mais j'ai ensuite implémenté Runnable pour la classe Client et depuis, à chaque fois que je lance ma classe Client, c'est mon serveur qui se lance (alors que ce numero de port fonctionnait très bien auparavant). :'(
    Est-ce un problème de gestion de Thread? Comment y remédier?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2011 à 19:50:19

      Peut-être ne suis je pas asez précis !

      Pour ma classe Serveur qui contient le main...

      import java.awt.*;
      import java.awt.event.*;
      import java.net.*;
      import java.io.*;
      
      import javax.swing.*;
      
      public class Serveur extends JFrame{
      	
      	private JTextArea sortieServeur;
      	private Socket[] socketConnecte = new Socket[4]; 
      	private String[] pseudos = new String[4];
      	private Joueur[] joueurs = new Joueur[4];
      	private ServerSocket socketserver;
      	
      	BufferedReader inServeur;
      	PrintWriter outServeur;
      	
      	private int i = 1;
      	private int k = 1;
      	
      	public Serveur(){
      			
      		super("Serveur du jeu de mots");
      			
      		sortieServeur = new JTextArea();
      		getContentPane().add(sortieServeur, BorderLayout.CENTER );
      		setSize(300,300);
      		show();
      		
      		try{
      			socketserver=new ServerSocket(2011);
      			sortieServeur.setText("Création du serveur de jeu ! \n");
      			sortieServeur.append("Le serveur est à l'écoute du port "+socketserver.getLocalPort()+". \n");
      			} catch (Exception e){
      				e.printStackTrace();
      			}
      			
      			sortieServeur.append("Le serveur attend que 3 joueurs se connectent... \n");
      				
      	}
      		
      	public void executer(){
      		while(i<4)
      		{
      			try {
      				socketConnecte[i] = socketserver.accept();
      				sortieServeur.append("Ajout d'un nouveau joueur");
      				joueurs[i]=new Joueur(socketConnecte[i],k);
      				joueurs[i].start();
      			} catch (Exception e) {
      				e.printStackTrace();
      			}
      			//System.out.println("Le joueur :"+ i +"vient de se connecter au serveur ! ");
      			//outServeur = new PrintWriter(socketConnecte[i].getOutputStream());
      			//outServeur.flush();
              //inServeur = new BufferedReader (new InputStreamReader(socketConnecte[i].getInputStream()));
              //pseudos[i] = inServeur.readLine();
              //System.out.println("Le joueur "+i+" s'appelle "+ pseudos[i]);
      			i++;
      		}
      		
      		
      		
      		for (i=1;i<3;i++){
      			try {
      				socketConnecte[i].close();
      			} catch (Exception e) {
      				e.printStackTrace();
      			}
      		}
      			try {
      				socketserver.close();
      			} catch (IOException e) {
      				e.printStackTrace();
      			}
      		
      		
      	}
      		
      	public static void main(String[] zero){
      		
      		Serveur jeu = new Serveur();
      		
      		jeu.addWindowListener(new WindowAdapter(){  
      			public void windowClosing(WindowEvent e){
      		               System.exit(0);
      		            }
      		}  
      		);
      		
      		jeu.executer();
      	}
      
      
      }
      


      Et pour ma classe Client :

      import java.awt.*;
      import java.awt.event.*;
      import java.net.*;
      import java.io.*;
      import javax.swing.*;
      
      import javax.swing.JTextField;
      
      
      public class Client extends JFrame implements Runnable {
      	
      	private JPanel conteneurClient = new JPanel();
      	private JTextField champEntree;
      	private JTextArea affichage;
      	private JLabel label = new JLabel("Message du serveur");
      	
      	private Thread threadSortie;
      
      
      	// On commence par construire l'interface graphique
      	public void init(){
      		
      		this.setTitle("Fenetre du joueur");
      		this.setSize(300,300);
      		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              this.setLocationRelativeTo(null);
              
              conteneurClient.setBackground(Color.white);
              conteneurClient.setLayout(new BorderLayout());
      		
              JPanel top = new JPanel();
              
              Font police = new Font("Arial", Font.BOLD, 14);
              champEntree.setFont(police);
              champEntree.setPreferredSize(new Dimension(150, 30));
              champEntree.setForeground(Color.BLUE);
              
              top.add(label);
              top.add(champEntree);
              conteneurClient.add(top,BorderLayout.NORTH);
              this.setContentPane(conteneurClient);
              this.setVisible(true); 
              show();
      		
      	}
      	// On se connecte ensuite au serveur
      	public void start(){
      		
      		Socket socket;
      		BufferedReader inClient;
      		PrintWriter outClient;
      		
      		try{
      			socket=new Socket(InetAddress.getLocalHost(),2011);
      			System.out.println("Demande de connexion");
      			
      			//inClient = new BufferedReader (new InputStreamReader(socket.getInputStream()));
      			//String message_distant = inClient.readLine();
      			//System.out.println(message_distant);
      		} catch (Exception e){
      			e.printStackTrace();
      		}
      		
      		threadSortie = new Thread(this);
      	    threadSortie.start();
      	}
      	// On lance le jeu
      	public void run(){
      		
      	}
      }
      


      Et enfin ma classe Joueur :

      import java.net.*;
      
      
      public class Joueur extends Thread{
      	
      	public Joueur(Socket s, int i){
      		
      	}
      
      }
      


      Donc voila ! ça vous éclaire?
      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2011 à 21:32:26

        Salut,


        Il faut normalement que tu crées 2 programmes : Un pour le serveur et un pour le client. Cela te fais donc 2 fonctions main.

        D'abord tu lances ton serveur, et quand un client ce connecte tu lance ton thread Joueur.

        La classe Joueur
        class Joueur implements Runnable {
        	Joueur(Socket s, int i) {
        		// code du constructeur
        	}
        
        	public void run() {
        		// code a executer dans le thread
        	}
        }
        


        Le code pour le serveur :
        try {
        	socketConnecte[i] = socketserver.accept();
        	sortieServeur.append("Ajout d'un nouveau joueur");
        	joueurs[i]=new Joueur(socketConnecte[i],k);
        	Thread t = new Thread(joueur[i]);
        	t.start();
        } catch (Exception e) {
        	e.printStackTrace();
        }
        


        et dans la classe client, tu fais quelque chose comme

        class Client {
        	public static void main (String args) {
        		Socket s = new Socket(address, port);
        		Joueur j = new Joueur(s,0);
        		Thread t = new Thread(j);
        		t.start();
        	}
        }
        


        En considérant que le code Joueur est identique entre ton client et ton serveur.


        Cordialement,
        Patouche
        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2011 à 10:53:08

          Bonjour,

          Merci pour ton aide ! J'ai tout repris et apporté quelques modifications et ça à l'air de fonctionner !

          Bonne fin de matinée !
          • Partager sur Facebook
          • Partager sur Twitter

          Gestion Client Serveur par Socket avec Runnable

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown