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
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
A voir également:
- Application client/serveur java example
- Waptrick java football - Télécharger - Jeux vidéo
- Application mobile - Guide
- Jeux java itel football - Télécharger - Jeux vidéo
- Application java - Télécharger - Langages
- Changer serveur dns - Guide
2 réponses
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
19 août 2013 à 19:48
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 :
Ce qui donne :
La ligne 60 étant chez moi :
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
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
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
Modifié par kij_82 le 21/08/2013 à 13:59
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 :) ~
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 :) ~
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
22 août 2013 à 12:42
comment laisser un serveur en attente après l'envoi du message ?.!!!!
merci Cordialement
merci Cordialement
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
22 août 2013 à 21:49
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)
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
22 août 2013 à 22:12
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.
...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.
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
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 .
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
25 août 2013 à 23:09
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.
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.
22 août 2013 à 11:58
----------------
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 :/