Java application serveur multiserveur

Fermé
manana007 - 14 mai 2008 à 12:06
 james - 22 janv. 2009 à 17:51
Bonjour,
j'essaie de faire une application serveur multiclient en java en exploitant les thread mais si je lance le serveur et un client tout ca marche mais si je lance un autre client il prend bk de temps pour que le serveur détecte cette connection malgré qué au client il affiche que ce deusième client est connecter voici mon code
code serveur :
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class tcpServer extends JFrame implements ActionListener
{
//Declare Variables
private Vector _tabClients = new Vector(); // contiendra tous les flux de sortie vers les clients
private int _nbClients=0; // nombre total de clients connectés
private int port;
private String portNum, ipAddress, name;
private ServerSocket server_socket;
private BufferedReader input, input2;
private PrintWriter output, output2;
private Container pane = getContentPane() ;
private JButton cancel , send, exit;

private JPanel buttonPanel;
private ImageIcon tittle= new ImageIcon("tittles.gif");
static JTextArea display;
Hashtable htOnlineUsers = new Hashtable(10);
Hashtable htOfflineUsers = new Hashtable(10);

//Menu Bar/
private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu= new JMenu("File");
private JMenu helpMenu= new JMenu("Help");
private JMenuItem exitMenu = new JMenuItem("Exit");
private JMenuItem aboutMenu= new JMenuItem("About");


//Server Constructor
public tcpServer() throws IOException
{
super("DMSenger Server");
portNum = JOptionPane.showInputDialog(this, "Please Enter Port Number");
port = Integer.parseInt(portNum);
ipAddress = JOptionPane.showInputDialog(this, "Please Enter Local IP Address");
setup();
serverRun();
}
synchronized public void sendAll(String message,String sLast)
{
PrintWriter out; // declaration d'une variable permettant l'envoi de texte vers le client
for (int i = 0; i < _tabClients.size(); i++) // parcours de la table des connectés
{
out = (PrintWriter) _tabClients.elementAt(i); // extraction de l'élément courant (type PrintWriter)
if (out != null) // sécurité, l'élément ne doit pas être vide
{
// ecriture du texte passé en paramètre (et concaténation d'une string de fin de chaine si besoin)
out.print(message+sLast);
out.flush(); // envoi dans le flux de sortie
}
}
}
static private void printWelcome(Integer port)
{
System.out.println("--------");
System.out.println("BlablaServeur : Par Minosis - Julien Defaut");
System.out.println("Copyright : 2004 - Minosis.com");
System.out.println("Derniere version : 10/04/2004");
System.out.println("--------");
System.out.println("Demarre sur le port : "+port.toString());
System.out.println("--------");
System.out.println("Quitter : tapez \"quit\"");
System.out.println("Nombre de connectes : tapez \"total\"");
System.out.println("--------");
}
//** Methode : détruit le client no i **
synchronized public void delClient(int i)
{
_nbClients--; // un client en moins ! snif
if (_tabClients.elementAt(i) != null) // l'élément existe ...
{
_tabClients.removeElementAt(i); // ... on le supprime
}
}
//** Methode : ajoute un nouveau client dans la liste **
synchronized public int addClient(PrintWriter out)
{
_nbClients++; // un client en plus ! ouaaaih
_tabClients.addElement(out); // on ajoute le nouveau flux de sortie au tableau
return _tabClients.size()-1; // on retourne le numéro du client ajouté (size-1)
}
//** Methode : retourne le nombre de clients connectés **
synchronized public int getNbClients()
{
return _nbClients; // retourne le nombre de clients connectés
}
//Setup GUI Environment
public void setup()
{
//Create Menu Options
fileMenu.add(exitMenu);
menuBar.add(fileMenu);
helpMenu.add(aboutMenu);
menuBar.add(helpMenu);
setJMenuBar(menuBar);

//Action Losteners for Menu items/
exitMenu.addActionListener( this );
aboutMenu.addActionListener(this);

display = new JTextArea();
display.setLineWrap(true);
display.setEditable( false );
addWindowListener( new WindowHandler( this ) );
pane.add( new JScrollPane( display ),BorderLayout.CENTER );

setSize( 400, 400 );
setLocation( 10, 20 ) ;
show();
}



//Main Server Process
public void serverRun()
{
/*
* Serveurmulti blablaServ = new Serveurmulti(); // instance de la classe principale
try
{
Integer port;
if(args.length<=0) port=new Integer("18000"); // si pas d'argument : port 18000 par défaut
else port = new Integer(args[0]); // sinon il s'agit du numéro de port passé en argument
new Commandes(blablaServ); // lance le thread de gestion des commandes
ServerSocket ss = new ServerSocket(port.intValue()); // ouverture d'un socket serveur sur port
printWelcome(port);
while (true) // attente en boucle de connexion (bloquant sur ss.accept)
{
new ServeurThread(ss.accept(),blablaServ); // un client se connecte, un nouveau thread client est lancé
}
}
catch (Exception e) { }
**/
try
{
//Create New ServerSocket on port, with a buffer queue of 100
server_socket = new ServerSocket( port, 100);
new Commandes(this);
display.setText("Server waiting for client on port " + server_socket.getLocalPort() + "\n");
printWelcome(port);
// Server Infinite Loop

while(true)
{ //Setup Initial Connection
Socket socket = server_socket.accept();
new ServeurThread(socket,this);
display.append("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort() + "\n");
//Open IO Streams
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(socket.getOutputStream(),true);
name=input.readLine();
htOnlineUsers.put(name, socket);
//Create A New ThreadHandler
ThreadHandler th = new ThreadHandler(socket,name,htOnlineUsers, htOfflineUsers);
//Start the thread
th.start();

}
}
//Error Handling
catch (IOException e)
{
display.append("\n" + e);
}
}

//Actionlistner Response To Gui Events
public void actionPerformed( ActionEvent e )
{
if ( e.getSource() == exitMenu )
{
closeConnection() ;
}

else if (e.getSource() == aboutMenu)
{
About gui = new About(name);
gui.setIconImage(tittle.getImage());
gui.setSize(250,220);
gui.setTitle("About DMSenger Server ");
gui.setVisible(true);
}
}

//Close Socket Connection Mehtod
private void closeConnection()
{
try
{
//Tidy Up
server_socket.close();
server_socket=null;
//input.close();
System.exit(0);
}
catch (IOException e)
{
display.append("\n" + e);
System.exit( 0 ) ;
}
}
************************
code client :
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import javax.swing.text.*;


public class tcpClient extends JFrame implements ActionListener
{
private static int port;
private static String server, portNum, name;
private Socket socket = null;
private BufferedReader input;
private PrintWriter output;
private int ERROR = 1;
private Container pane = getContentPane() ;
private JTextArea display ;
private JButton send, show;
private JPanel buttonPanel, textPanel, btPanel ;
private JTextField enterBox2;
private JToggleButton jToggleButton1;
private static ImageIcon tittle= new ImageIcon("tittlec.gif");


//Menu Bar
private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu= new JMenu("File");
private JMenu helpMenu= new JMenu("Help");
private JMenuItem exitMenu = new JMenuItem("Exit");
private JMenuItem aboutMenu= new JMenuItem("About");
private static Login log = new Login();
private static boolean login=false;


public tcpClient()
{
super( "DMSenger" );

startUp();

setUp() ;

connect() ;

RunClient() ;

// closeConnection() ;
}

public static void startUp ()
{
//**Calls Login Screen and sets Tittle Image */

log.setIconImage(tittle.getImage());
log.setSize(230,180);
log.setTitle("Login to DMSenger");
log.setVisible(true);
while(login==false)
{
if (log.getLoginState()==true)
login=true;
}
name = log.getName();
portNum = log.getPort();
port = Integer.parseInt(portNum);
server = log.getIp();
log.setVisible(false);
}

public void setUp()
{
/** Gets Screen Resolution and Sets Program Coordinates */
int width = 400;
int height =400;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screen.width-width)/2;
int y = (screen.height-height)/2;
setBounds(x,y,width,height);

/** Create JButtons */
send = new JButton( "Send");
jToggleButton1 = new JToggleButton("B");
jToggleButton1.setText("B");
show = new JButton("Show");

//Create Menu Options
fileMenu.add(exitMenu);
menuBar.add(fileMenu);
helpMenu.add(aboutMenu);
menuBar.add(helpMenu);

/** Create and Add the JButtons to the buttonPanel */
buttonPanel = new JPanel() ;
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
buttonPanel.add(show);
buttonPanel.add(jToggleButton1);

/** Create JLabels */
enterBox2 = new JTextField();
enterBox2.setEditable(true);

/** Create JPanel */
textPanel = new JPanel() ;
btPanel = new JPanel();

/** Set up the layout manager for the testPanel */
textPanel.setLayout(new BoxLayout(textPanel, BoxLayout.X_AXIS));

textPanel.add( enterBox2 ) ;
textPanel.add( send );

/**Set up the layout for the btPanel */
btPanel.setLayout( new GridLayout(2,1));
btPanel.add(buttonPanel);
btPanel.add(textPanel);
pane.add( btPanel , BorderLayout.SOUTH) ;

//** Set the Menu Bar*/
setJMenuBar(menuBar);

/** Action Listener for the send and clear JButtons */
send.addActionListener( this );
show.addActionListener(this);

//Action and Key Listeners For the Menu, Text Fields and Toggle Buttons */
exitMenu.addActionListener(this);
aboutMenu.addActionListener(this);

enterBox2.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent evtent)
{
enterBox2KeyTyped(evtent);
}
});

jToggleButton1.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent ev)
{
JButtonAction(ev);
}
});



/** Create JTextArea */
display = new JTextArea();
display.setLineWrap(true);
display.setEditable( false );

/** Create JScrollPane for the main area of the JFrame */
pane.add( new JScrollPane( display ));
addWindowListener( new WindowHandler( this ) );
show();

}

public void connect()
{
try
{
socket = new Socket(server, port);
display.setText("Connected with server " + socket.getInetAddress() + ":" + socket.getPort()+"\n");
}
catch (UnknownHostException e)
{
display.setText("" + e);
System.exit(ERROR);
}
catch (IOException e)
{
display.setText("\n" + e);
System.exit(ERROR);
}
}

/** ***********************************************************
* The sendData() method in the client sends data to the server
************************************************************ */
public void sendData(String str)
{
output.println(str);
}


/** ***********************************************************
* The RunClient() method in the client reads and writes data
* to the server.
**************************************************************/
public void RunClient()
{
try
{
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(socket.getOutputStream(),true);
sendData(name);

while(true)
{

String message = input.readLine();
deneme(message);
}
}
catch (NullPointerException e)
{
display.append("\n" + e);
}
catch(IOException e)
{
display.append("\n2"+e);
}
}

//**Set AutoScroll to the TextField*/
public void deneme(String message)
{
display.append(name+":>"+message+"\n");
display.setCaretPosition(display.getDocument().getLength());
}

public void actionPerformed( ActionEvent e )
{
// gets user input and sends it to server
if ( e.getSource() == send )
{
sendData( enterBox2.getText() );
enterBox2.setText( "" );
}
else if(e.getSource()==show)
{
sendData("list");
}
else if (e.getSource() == exitMenu)
{
// closeConnection();
}
else if (e.getSource()==aboutMenu)
{
About gui = new About();
gui.setIconImage(tittle.getImage());
gui.setSize(250,220);
gui.setTitle("About DMSenger ");
gui.setVisible(true);
}

}

private void enterBox2KeyTyped(KeyEvent evtent)
{
char keychar = evtent.getKeyChar();
if(keychar == KeyEvent.VK_ENTER)
{
sendData( enterBox2.getText());
enterBox2.setText( "" );
}

}

private void JButtonAction(ItemEvent ev)
{
int state = ev.getStateChange();
if (state == ItemEvent.SELECTED)
{
enterBox2.setFont(new Font( "Ariel", Font.BOLD, 14) );
}
else
{
enterBox2.setFont(new Font( "Ariel", Font.PLAIN, 14) );
}
}



public void closeConnection()
{
sendData( "QUIT" ) ;
try
{
socket.close();
input.close();
output.close();
}
catch (IOException e)
{
display.append("\n" + e);
}

setVisible( false );
// System.exit( 0 );
}

public static void main(String[] args)
{
final tcpClient client = new tcpClient() ;
client.addWindowListener(
new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
client.closeConnection() ;
}
}

);
}

public class WindowHandler extends WindowAdapter
{

tcpClient tcpC;

public WindowHandler( tcpClient t )
{
tcpC = t;
t.setIconImage(tittle.getImage());
}

public void windowClosing( WindowEvent e )
{
// tcpC.closeConnection();
}
}


}
**********************
svp aider moi je ne trouve pas de solution ??????????????????????????
A voir également:

2 réponses

Ecris plus correctement et j'envisagerai peut être de t'apporter une solution, car la solution est simple.
0
Salut,
je fais actuellement un projet similaire.
J'ai testé ton prog et c'est vrai que sa plante quand il y a un second client.
As-tu trouvé la solution ?
0