Communcation Client C# Java Serveur [Résolu]

frycco 2 Messages postés lundi 7 juillet 2003Date d'inscription 9 mars 2008 Dernière intervention - 8 mars 2008 à 14:36 - Dernière réponse : frycco 2 Messages postés lundi 7 juillet 2003Date d'inscription 9 mars 2008 Dernière intervention
- 9 mars 2008 à 13:09
Bonjour à tous,

    Voilà, j'ai un souci de communication entre mon client C# et mon serveur JAVA. Mon client, se connecte correctement à mon serveur mais je n'arrive pas à lui transmettre un message de type string encodé en UTF-8.

voilà le bout de code de réception du serveur JAVA :
   
    BufferedInputStream bufferedinputstream = new BufferedInputStream(clientSocket.getInputStream());
    DataInputStream datainputstream = new DataInputStream(bufferedinputstream);
    String Message= datainputstream.readUTF();

Code de mon Client C# :
           
            String Header = "MON MESSAGE";
            TcpClient socket = new TcpClient();
            IPEndPoint server = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
           

            try
            {
                socket.Connect(server);
                NetworkStream nstream = socket.GetStream();
                BufferedStream bstream = new BufferedStream(nstream);
                BinaryWriter writer = new BinaryWriter(bstream);
                byte[] encoded = new System.Text.UTF8Encoding(false).GetBytes(Header);
                nstream.Write(encoded, 0, encoded.Length);
              
            }
            catch (Exception e)
            {
                Console.WriteLine("erreur " + e.Message);
            }
            finally
            {
                socket.Close();
            }

            Console.ReadKey();

Le problème est que mon serveur JAVA reste figé sur la méthode readUTF();

J'ai modifié mon serveur JAVA pour tester la réception :
           
            BufferedInputStream bufferedinputstream = new BufferedInputStream(clientSocket.getInputStream());
            DataInputStream datainputstream = new DataInputStream(bufferedinputstream);
            byte[] toto = new byte[20];
            datainputstream.read(toto);
            System.out.println(new String(toto));

J'obtiens en sortie le message :  MON MESSAGE

Donc la transmission de paquets fonctionne, j'ai vraiment le sentiment que le problème vient du type d'encodage.

ça fait deux jours que je galère dessus.
Votre aide est la bienvenue.
Merci
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
frycco 2 Messages postés lundi 7 juillet 2003Date d'inscription 9 mars 2008 Dernière intervention - 9 mars 2008 à 13:09
3
Merci
J'ai trouvé la solution, JAVA utilise un encodage UTF-8 modifié (non standard).
Pour résoudre le problème, il suffit d'écrire la classe DataOutputStream dérivé de BinaryWriter :

public class DataOutputStream : BinaryWriter
    {

        public DataOutputStream(Stream stream) : base(stream) { }

        public void writeUTF(String str)
        {
            int strlen = str.Length;
            int utflen = 0;
            int c, count = 0;                                          

            char[] charr = str.ToCharArray();
           

            for (int i = 0 ; i < strlen ; i++) {
                c = charr[i];                                         
                if ((c >= 0x0001) && (c <= 0x007F)) {
                    utflen++;
                } else if (c > 0x07FF) {
                    utflen += 3;
                } else {
                    utflen += 2;
                }
            }

            if (utflen > 65535) throw new Exception();

            byte[] bytearr = new byte[utflen+2];
            bytearr [count++] = (byte) (((utflen >> 8) >> 8) & 0xFF);        
            bytearr [count++] = (byte) (((utflen >> 0) >> 0) & 0xFF);        
            for (int i = 0 ; i < strlen ; i++) {
                c = charr[i];                                          
                if ((c >= 0x0001) && (c <= 0x007F)) {
                    bytearr [count++] = (byte) c;                      
                } else if (c > 0x07FF) {
                    bytearr [count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
                    bytearr [count++] = (byte) (0x80 | ((c >>  6) & 0x3F));
                    bytearr [count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
                } else {
                    bytearr [count++] = (byte) (0xC0 | ((c >>  6) & 0x1F));
                    bytearr [count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
                }
            }
           
            this.Write(bytearr);
        }
    }

Merci frycco 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de frycco

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.