Communcation Client C# Java Serveur

Résolu
frycco Messages postés 2 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 9 mars 2008 - 8 mars 2008 à 14:36
frycco Messages postés 2 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 9 mars 2008 - 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

1 réponse

frycco Messages postés 2 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 9 mars 2008
9 mars 2008 à 13:09
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);
        }
    }
3
Rejoignez-nous