Envoyer une chaine de caractére au serveur via les sockets

hindou23 Messages postés 42 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 20 octobre 2011 - 26 juil. 2011 à 16:05
 Utilisateur anonyme - 29 juil. 2011 à 16:02
Bonjour tout le monde ,

J'essais plusieurs jours d'envoyer une chaine de caractére sous forme d'hexa au serveur pour qu'il puissent la lire mais aucun avancement.

Si j'envoi la chaine sur 16 bits ca s'envoie et c'est parfait coté serveur aussi .

Mais dés que je rajoute un seul bit un message d'erreur s'affiche, vu que je dois envoyer une chaine de caractére tres longue de 158 bits...

Le message d'erreur est comme suit:


java.lang.NumberFormatException: For input string: "606000000400000320"
java.lang.NumberFormatException.forInputString(Unknown Source)
java.lang.Long.parseLong(Unknown Source)
java.lang.Long.valueOf(Unknown Source)
java.lang.Long.decode(Unknown Source)
com.metier.CommuniServeur.send(CommuniServeur.java:156)
com.action.InquiryThread.run(InquiryThread.java:35)
com.action.Connexion.execute(Connexion.java:61)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor

Merci d'avance pour votre aide

10 réponses

Utilisateur anonyme
27 juil. 2011 à 13:39
Bonjour

Tu ne devrais pas passer par une chaîne de caractère pour faire cet envoi. Dès que la chaîne ne peut pas être convertie en un entier de type primitif "long", ton programme plante. Utilise plutôt des instances de la classe BigInteger. Par contre, je ne vois pas trop en détail comment tu peux t'en servir dans ton cas précis.









T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Utilisateur anonyme
27 juil. 2011 à 13:43
Utilise la méthode toByteArray() pour convertir une instance de la classe BigInteger en tableau d'octets que tu peux envoyer via une socket.















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Utilisateur anonyme
27 juil. 2011 à 13:45
Tu peux créer une instance de la classe BigInteger avec le constructeur BigInteger(byte[] val), tu n'as qu'à lui passer tes valeurs hexadécimales sous forme d'un tableau d'octets et le tour est joué.













T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
hindou23 Messages postés 42 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 20 octobre 2011
28 juil. 2011 à 10:34
Bonjour,
Merci pour ta réponse , comme tu m'avais indiqué j'ai utilisé substring et pareShort et ca a marché...

J'avais déja utilisé ByteArray mais il me convertissait la chaine en ASCII et moi je voulais l'envoyer telle qu'elle est puisque ma chaine est en hexa!!!

J'ai un autre petit probléme au cours de la reception, au lieu que je recois juste la code envoyé par mon serveur je recois à la fin plein de zéro et aussi au lieu de recevoir 2 byte par exemple 04 je ne recois que 4
Voici un exemple de la chaine de caractére que je recois du serveur :
2 1 4 33 21 .....21 00000000000000000000000000000000000000000000

Au lieu de recevoir :

02 01 04 33 21 .....21

Voici le code la recpetion:

public String receive() {

String reponse = "";

char[] out = new char[1000];
try{

BufferedReader is = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
is.read(out);


// Close the Connection
is.close();
this.socket.close();

} catch (IOException e) {
System.err.println("Exception receive: " + e.getMessage());
return null;

}

for (int i = 0; i < out.length; i++) {


reponse = reponse + Integer.toString(out[i], 16).toUpperCase() +" ";}
return reponse;
}


Merci d'avance pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 juil. 2011 à 11:37
Bonjour

Je ne comprends pas ce que tu fais, ce n'est pas ce que je t'ai proposé de faire. Tu es sensé utiliser un tableau d'octets à la réception ET à l'envoi. Tu ne dois pas passer par des tableaux de caractères, tu dois récupérer les octets et éventuellement appeler Integer.toHexString.













T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
hindou23 Messages postés 42 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 20 octobre 2011
28 juil. 2011 à 12:15
Je l'ai fait en premier temps mais ca n marchait pas, c'est pour cette raison j'ai fait comme suit:

public void send(String message ) {



try {


OutputStream out = socket.getOutputStream();

DataOutputStream dataOut = new DataOutputStream(out);
System.out.println("I'm here");




while(message.length() > 0){
String byteToWrite;
if(message.length() <= 2){
byteToWrite = message;
message = "";
}
else{
byteToWrite = message.substring(0,2);
message = message.substring(2);
}
byte b = (byte)Short.parseShort(byteToWrite, 16);
dataOut.write(b);
System.out.println("le byte est : "+b);

dataOut.flush();

}

}



catch (IOException e) {
System.err.println("Exception send: " + e.getMessage());
}
}
0
hindou23 Messages postés 42 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 20 octobre 2011
28 juil. 2011 à 12:17
l'envoi mnt marche mais le probléme c'est la réception!!!

Au lieu d'avoir la chaine compléte avec les zéro , ils ne s'affichent pas et par de suite une longue suite de zéro aprés la fin de la chaine envoyée par le serveur comme caa:

2 4 3 33 55 2 21 4 000000000000000000000000000000000000000000000000000000000
0
Fauchmanne Messages postés 35 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 26 septembre 2011 1
29 juil. 2011 à 10:01
Si tu veux envoyer une chaîne de caractères au serveur, pourquoi diable lui envoies-tu des bytes, au lieu d'une chaîne de caractères ?
0
hindou23 Messages postés 42 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 20 octobre 2011
29 juil. 2011 à 11:12
Parce que le serveur doit connaitre que c'est une chaine d hexa sinon il va la considérer comme un String et l'a convertir en un code ASCII
0
Utilisateur anonyme
29 juil. 2011 à 16:02
Tu parles d'hexa, cela veut dire que tu manipules des nombres que tu souhaites afficher en base 16 au lieu de les afficher en base 10. C'est plutôt ta façon de faire qui est bizarre car tu transformes un nombre en chaîne de caractères pour le retransformer en nombre après. Comme ton nombre tient sur 158 bits, tu ne peux pas utiliser une seule valeur stockée dans un type primitif car cela ne peut contenir que de 8 bits (byte) à 64 bits (long) d'où l'idée de stocker tes 158 bits dans plusieurs octets sous forme d'un tableau (byte[]).

Le serveur ne considère pas que c'est une String. Une fois que tu as récupéré ta valeur (ton nombre) via le socket, tu peux utiliser un formateur pour l'afficher sous forme d'hexa avec exactement le nombre de zéros supplémentaires que tu veux à gauche ou à droite. Cordialement.






T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Rejoignez-nous