Socket client Serveur Tcp Sous java

Fermé
zidani_abdelali_17 Messages postés 5 Date d'inscription lundi 19 août 2013 Statut Membre Dernière intervention 26 août 2013 - 19 août 2013 à 15:27
zidani_abdelali_17 Messages postés 5 Date d'inscription lundi 19 août 2013 Statut Membre Dernière intervention 26 août 2013 - 26 août 2013 à 12:18
Bonjour tout le monde ,

j'ai écrit deux processus client / serveur : ( je travail avec le netbeans )

le client envoie un message vers le serveur et le serveur aussi , mais le problème c'est que je ne reçois pas les message envoyer parle le client , il m affiche ce message
run:
Attempting to connect to 127.0.0.1:9990
Connection Established
Response from server:
3.000.000.12.136W
Cannot establish connection. Server may not be up.Connection reset
BUILD SUCCESSFUL (total time: 0 seconds)

je vous laisse avec mon code et merci de me signaler l'erreur :)

----------------------------------------------------------------------------------------------------------

Coté serveur :

----------------------------------------------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSockeimportt;
import java.net.Socket;

public class SocketServer {

public ServerSocket serverSocket;
public int port;

public SocketServer(int port) {
this.port = port;
}

public void start() throws IOException {
System.out.println("Starting the socket server at port:" + port);
serverSocket = new ServerSocket(port);

//Listen for clients. Block till one connects

System.out.println("Waiting for clients...");
Socket client = serverSocket.accept();

//A client has connected to this server. Send welcome message
sendWelcomeMessage(client);
}

public void sendWelcomeMessage(Socket client) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
writer.write("3.000.000.12.136W");
writer.write("\n"); // shown separately for clarity
writer.flush();
}

/**
* Creates a SocketServer object and starts the server.
*
* @param args
*/
public static void main(String[] args) {
// Setting a default port number.
int portNumber = 9990;

try {
// initializing the Socket Server
SocketServer socketServer = new SocketServer(portNumber);
socketServer.start();

} catch (IOException e) {
e.printStackTrace();
}
}
}

----------------------------------------------------------------------------------------------------------

Coté Client :

----------------------------------------------------------------------------------------------------------



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class SocketClient {

public String hostname;import
public int port;
Socket socketClient;

public SocketClient(String hostname, int port){
this.hostname = hostname;
this.port = port;
}

public void connect() throws UnknownHostException, IOException{
System.out.println("Attempting to connect to "+hostname+":"+port);
socketClient = new Socket(hostname,port);
System.out.println("Connection Established");
}

public void readResponse() throws IOException{
String userInput;
BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));

System.out.println("Response from server:");
while ((userInput = stdIn.readLine()) != null) {
System.out.println(userInput);
}}



public void sendResponse() throws IOException{
PrintWriter pred = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socketClient.getOutputStream())),true);
String str = "22.000..B..";
pred.println(str);
System.out.println("the message was sent to the server");
}

public static void main(String arg[]){
//Creating a SocketClient object
SocketClient client = new SocketClient ("127.0.0.1",9990);
try {
//trying to establish connection to the server
client.connect();
//if successful, read response from server
client.readResponse();
//
client.sendResponse();

} catch (UnknownHostException e) {
System.err.println("Host unknown. Cannot establish connection");
} catch (IOException e) {
System.err.println("Cannot establish connection. Server may not be up."+e.getMessage());
}
}
}

2 réponses

KX Messages postés 16602 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 3 octobre 2022 2 974
19 août 2013 à 19:48
Il ne faut pas masquer les exceptions avec des System.err.println parce que tu perds la trace d'erreur, il vaut mieux faire de nouvelles exceptions en mettant la cause en paramètre, cela nous permet d'en apprendre plus pour l'erreur.

Exemple :

catch (UnknownHostException e)
{
    throw new RuntimeException("Host unknown. Cannot establish connection",e);
}
catch (IOException e)
{
    throw new RuntimeException("Cannot establish connection. Server may not be up.", e);
}

Ce qui donne :

Exception in thread "main" java.lang.RuntimeException: Cannot establish connection. Server may not be up.
	at packTest.SocketClient.main(SocketClient.java:71)
Caused by: java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(Unknown Source)
	at java.net.SocketInputStream.read(Unknown Source)
	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at java.io.InputStreamReader.read(Unknown Source)
	at java.io.BufferedReader.fill(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at java.io.BufferedReader.readLine(Unknown Source)
	at packTest.SocketClient.readResponse(SocketClient.java:37)
	at packTest.SocketClient.main(SocketClient.java:60)

La ligne 60 étant chez moi :
client.readResponse();
Et la ligne 37 :
while ( (userInput = stdIn.readLine()) != null)
Ici le problème c'est que stdIn n'est pas prêt (stdIn.ready()==false), tu peux par exemple rajouter le test dans ta boucle :

while (stdIn.ready() && (userInput = stdIn.readLine()) != null)
{
    System.out.println(userInput);
}

Remarque : envoyer les messages ou les recevoir, au final c'est le même traitement, il s'agit d'un transfert d'un flux de sortie vers un flux d'entrée. Donc ce n'est pas la peine de faire plusieurs méthodes read/send, c'est source d'erreurs alors qu'une seule méthode suffit, tu pourras voir un exemple ici :

https://forums.commentcamarche.net/forum/affich-22960561-envoi-des-fichiers-par-des-sockets-java#3
0
zidani_abdelali_17 Messages postés 5 Date d'inscription lundi 19 août 2013 Statut Membre Dernière intervention 26 août 2013
22 août 2013 à 11:58
Premièrement merci d avoir m'aider , Deuxièmement je suis débutant dans ce langage Java , voila la modification que j'ai fait :
----------------
Client
---------------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketClient {

private String hostname;
private int port;
Socket socketClient;

public SocketClient(String hostname, int port){
this.hostname = hostname;
this.port = port;
}

public void connect() throws UnknownHostException, IOException{
System.out.println("Attempting to connect to "+hostname+":"+port);
socketClient = new Socket(hostname,port);
System.out.println("Connection Established");

}

public void readResponse() throws IOException{
String userInput;
BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));

System.out.println("Response from server:");
//while ((userInput = stdIn.readLine()) != null) {
// System.out.println(userInput);
//}
while (stdIn.ready() && (userInput = stdIn.readLine()) != null)
{
System.out.println(userInput);
}
}



public void sendResponse() throws IOException{
PrintWriter pred = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socketClient.getOutputStream())),true);
String str = "test";
pred.println(str);
System.out.println("the message was sent to the server");
}

public static void main(String arg[]){
//Creating a SocketClient object
SocketClient client = new SocketClient ("127.0.0.1",9990);
try {
//trying to establish connection to the server
client.connect();
//if successful, read response from server
client.readResponse();
//
client.sendResponse();

} catch (UnknownHostException e) {
System.err.println("Host unknown. Cannot establish connection");
} catch (IOException e) {
System.err.println("Cannot establish connection. Server may not be up."+e.getMessage());
}
}
}

le résultats été :
RUN:
Attempting to connect to 127.0.0.1:9990
Connection Established
Response from server:
3.000.000.12.136W
the message was sent to the server
BUILD SUCCESSFUL (total time: 0 seconds)

------------------
Serveur
------------------

package toto;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

private ServerSocket serverSocket;
private int port;

public SocketServer(int port) {
this.port = port;
}

public void start() throws IOException {
System.out.println("Starting the socket server at port:" + port);
serverSocket = new ServerSocket(port);

//Listen for clients. Block till one connects

System.out.println("Waiting for clients...");
Socket client = serverSocket.accept();

//A client has connected to this server. Send welcome message
sendWelcomeMessage(client);
}

private void sendWelcomeMessage(Socket client) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
writer.write("3.000.000.12.136W");
writer.write("\n"); // shown separately for clarity
writer.flush();
}

/**
* Creates a SocketServer object and starts the server.
*
* @param args
*/
public static void main(String[] args) {
// Setting a default port number.
int portNumber = 9990;

try {
// initializing the Socket Server
SocketServer socketServer = new SocketServer(portNumber);
socketServer.start();

} catch (IOException e) {
e.printStackTrace();
}
}
}



le résultats été :
RUN:
Starting the socket server at port:9990
Waiting for clients...
BUILD SUCCESSFUL (total time: 5 seconds)

le serveur ne recoit pas le message de client par contre le client a reçu ce message the message was sent to the server c'est quoi le problème :/
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 856
Modifié par kij_82 le 21/08/2013 à 13:59
Bonjour,

Hormis la remarque de KX, le problème que tu as est un problème de logique de déroulement.
Voici actuellement le scénario de déroulement de ton problème:

- Ton serveur est démarré (et donc attends une connexion cliente)
- Ton client est démarré et se connecte au serveur
- Le serveur détecte le client et envoie une première réponse sur la connexion cliente
- Ton serveur n'attends rien en retour et continue son traitement (qui en fait termine simplement le programme)
- La connexion est close coté serveur
- Le client lit la réponse du serveur
- Le client tente d'envoyer un message au serveur
- Comme ta connexion a été fermée coté serveur, tu obtiens un message d'erreur de type "connection release"


Pour corriger ton problème, suite à l'envoi de son message, le serveur devrait attendre un message (donc lire sur la connnection), faire d'autres traitement, etc. Je t'avouerais que je n'ai pas franchement lu l'intégralité du code, simplement regardé les traces et les fonctionnements de départ.
Mais en gros, ici tu fais de la connection et de la discussion "en directe", il te faut donc traduire ces échanges dans ton code (attente, lecture, renvoi de message, ré attente en lecture, etc.) que ce soit coté client que coté serveur.

Petite remarque 'à l'avance':
Tu devrais garder ta classe serveur qui effectue juste les attentes de connexion de client, puis dédié le traitement de la discution avec un client à un autre thread. Ceci impliquera donc une gestion de pool, etc. et te permettra peut-être de voir certains aspect que tu n'as pas encore vu, et ainsi progressé d'avantage.

Bon courage.



~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~
0
zidani_abdelali_17 Messages postés 5 Date d'inscription lundi 19 août 2013 Statut Membre Dernière intervention 26 août 2013
22 août 2013 à 12:42
comment laisser un serveur en attente après l'envoi du message ?.!!!!
merci Cordialement
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 856
22 août 2013 à 21:49
De la même manière que tu lis un message du serveur depuis le client, tu peux faire la même chose depuis ton serveur, après avoir envoyé le message. Tu as déjà le code qu'il te faut, si tu ne sais pas à quoi il correspond, c'est donc qu'il ne vient pas de toi, et si c'est le cas, la moindre des choses avant de demander pourquoi un programme ne fonctionne pas, c'est d'essayer de comprendre ce qu'il fait, comment il le fait, et pourquoi (et donc ce qui ne vas pas en cas d'erreur ou de comportement non attendu)
0
KX Messages postés 16602 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 3 octobre 2022 2 974 > kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
22 août 2013 à 22:12
"la moindre des choses avant de demander pourquoi un programme ne fonctionne pas, c'est d'essayer de comprendre ce qu'il fait, comment il le fait, et pourquoi"
...Ou en choper un autre, un qui fonctionne déjà et dont le fonctionnement est simple.
Parce que ce code là, qui que ce soit qui l'ai fait, il n'est ni simple ni fonctionnel.
0
zidani_abdelali_17 Messages postés 5 Date d'inscription lundi 19 août 2013 Statut Membre Dernière intervention 26 août 2013
24 août 2013 à 17:39
j'ai dit que je suis encore débutant et j'aimerais bien m aider pour terminer ce problème . merci d avance ;) tu vas me donner un grand service .
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 856
25 août 2013 à 23:09
Tu as une méthode readMessage, une méthode sendMessage, que te faut-il de plus pour faire ce que tu souhaites ? Utilise ces méthodes aussi bien coté client que serveur pour établir un "dialogue".

Te donner le code tout fait ne te rendra certainement pas service. Si tu éprouves encore des difficultés à résoudre ce problème, suis quelques tutoriaux sur les échanges client / serveur basique en Java, et je pense que tu y arriveras.
0