2017-10-01 5 views
0

J'essaie de créer une calculatrice simple avec un diagramme client-serveur dans C# en utilisant System.Net.Socket. Tout fonctionne, mais côté serveur, quand j'essaye de convertir les valeurs reçues du client, c'est toujours convertir les valeurs en décimal, pas en nombre entier mais j'essaye beaucoup de temps, toujours pas résolu.Le tableau d'octets renvoie toujours un nombre décimal non entier dans C#

exemple, lorsque l'entrée client a = 5 et b = 5 valeur, dans un côté du serveur, il est tour à 53 et 53.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 

namespace Server_Fix 
{ 
    class Program 
    { 
     private static int SendVarData(Socket s, byte[] data) 
     { 
      int total = 0; 
      int size = data.Length; 
      int dataleft = size; 
      int sent; 

      byte[] datasize = new byte[4]; 
      datasize = BitConverter.GetBytes(size); 
      sent = s.Send(datasize); 

      while (total < size) 
      { 
       sent = s.Send(data, total, dataleft, SocketFlags.None); 
       total += sent; 
       dataleft -= sent; 
      } 
      return total; 
     } 

     private static byte[] ReceiveVarData(Socket s) 
     { 
      int total = 0; 
      int recv; 
      byte[] datasize = new byte[4]; 

      recv = s.Receive(datasize, 0, 4, 0); 
      int size = BitConverter.ToInt32(datasize,0); 
      int dataleft = size; 
      byte[] data = new byte[size]; 


      while (total < size) 
      { 
       recv = s.Receive(data, total, dataleft, 0); 
       if (recv == 0) 
       { 
        data = Encoding.ASCII.GetBytes("exit "); 
        break; 
       } 
       total += recv; 
       dataleft -= recv; 
      } 
      return data; 
     } 


     public static void Main() 
     { 
      byte[] data = new byte[1024]; 
      byte[] data1 = new byte[1024]; 
      byte[] data2 = new byte[1024]; 
      byte[] data3 = new byte[1024]; 
      IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); 

      Socket newsock = new Socket(AddressFamily.InterNetwork, 
          SocketType.Stream, ProtocolType.Tcp); 

      newsock.Bind(ipep); 
      newsock.Listen(10); 
      Console.WriteLine("Waiting for a client..."); 

      Socket client = newsock.Accept(); 
      IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; 
      Console.WriteLine("Connected with {0} at port {1}", 
          newclient.Address, newclient.Port); 

      string welcome = "CALCULATOR CLIENT-SERVER DIAGRAM!"; 
      data = Encoding.ASCII.GetBytes(welcome); 
      int sent = SendVarData(client, data); 

      string phepToan; 
      int result=0; 
      int a = 0, b = 0; 
      while(true) 
      { 


       sent = SendVarData(client, Encoding.ASCII.GetBytes("Nhap vao so a: ")); 
       data1 = ReceiveVarData(client); 

       //Console.WriteLine("Client: " + Encoding.ASCII.GetString(data)); 
       sent = SendVarData(client, Encoding.ASCII.GetBytes("Nhap vao so b: ")); 
       data2 = ReceiveVarData(client); 
       //b = Convert.ToInt32(data2); 
       sent = SendVarData(client, Encoding.ASCII.GetBytes("Cho biet phep tinh can dung la | + | - | * |/|: ")); 
       data3 = ReceiveVarData(client); 
       phepToan = Encoding.ASCII.GetString(data3); 
       //a = Convert.ToString(Encoding.ASCII.GetString(data1)); 
       if (phepToan=="+") 
       { 
        foreach (byte byteValue in data1) 
        { 
         a = Convert.ToChar(byteValue); //It's always turn to Decimal values            
        } 
        foreach (byte byteValue in data2) 
        { 
         b = Convert.ToChar(byteValue); //It's always turn to Decimal values 
        } 
        result = a + b; 

        sent = SendVarData(client, Encoding.ASCII.GetBytes("Ket qua phep tinh: "+Convert.ToString(result))); 
       } 
       if (phepToan == "-") 
       { 

       } 
       if (phepToan == "*") 
       { 

       } 
       if (phepToan == "/") 
       { 

       } 
      } 
      Console.WriteLine("Disconnected from {0}", newclient.Address); 
      client.Close(); 
      newsock.Close(); 
      Console.ReadLine(); 
     } 
    } 
} 

============== ============================================= code de côté client

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 

namespace Client_Fix 
{ 
    class Program 
    { 
     private static int SendVarData(Socket s, byte[] data) 
     { 
      int total = 0; 
      int size = data.Length; 
      int dataleft = size; 
      int sent; 

      byte[] datasize = new byte[4]; 
      datasize = BitConverter.GetBytes(size); 
      sent = s.Send(datasize); 

      while (total < size) 
      { 
       sent = s.Send(data, total, dataleft, SocketFlags.None); 
       total += sent; 
       dataleft -= sent; 
      } 
      return total; 
     } 

     private static byte[] ReceiveVarData(Socket s) 
     { 
      int total = 0; 
      int recv; 
      byte[] datasize = new byte[4]; 

      recv = s.Receive(datasize, 0, 4, 0); 
      int size = BitConverter.ToInt32(datasize,0); 
      int dataleft = size; 
      byte[] data = new byte[size]; 

      while (total < size) 
      { 
       recv = s.Receive(data, total, dataleft, 0); 
       if (recv == 0) 
       { 
        data = Encoding.ASCII.GetBytes("exit "); 
        break; 
       } 
       total += recv; 
       dataleft -= recv; 
      } 
      return data; 
     } 

     public static void Main() 
     { 
      byte[] data = new byte[1024]; 
      int sent; 
      IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); 

      Socket server = new Socket(AddressFamily.InterNetwork, 
          SocketType.Stream, ProtocolType.Tcp); 

      try 
      { 
       server.Connect(ipep); 
      } 
      catch (SocketException e) 
      { 
       Console.WriteLine("Unable to connect to server."); 
       Console.WriteLine(e.ToString()); 
       return; 
      } 
      string input; 
      data = ReceiveVarData(server); 
      string stringData = Encoding.ASCII.GetString(data); 
      Console.WriteLine(stringData); 
      while (true) 
      { 

       data = ReceiveVarData(server);    
       Console.Write("Server: " + Encoding.ASCII.GetString(data)); 

       Console.WriteLine("You: " + input); 
       sent = SendVarData(server, Encoding.ASCII.GetBytes(input)); 

       data = ReceiveVarData(server); 
       Console.Write("Server: " + Encoding.ASCII.GetString(data)); 

       input = Console.ReadLine(); 
       //Console.SetCursorPosition(0, Console.CursorTop - 1); 
       Console.WriteLine("You: " + input); 
       sent = SendVarData(server, Encoding.ASCII.GetBytes(input)); 


       data = ReceiveVarData(server); 
       Console.Write("Server: " + Encoding.ASCII.GetString(data)); 

       input = Console.ReadLine(); 
       //Console.SetCursorPosition(0, Console.CursorTop - 1); 
       Console.WriteLine("You: " + input); 
       sent = SendVarData(server, Encoding.ASCII.GetBytes(input)); 

       data = ReceiveVarData(server); 
       Console.WriteLine("Server: " + Encoding.ASCII.GetString(data)); 
      } 

      Console.WriteLine("Disconnecting from server..."); 
      server.Shutdown(SocketShutdown.Both); 
      server.Close(); 
      Console.ReadLine(); 
     } 
    } 
} 
+3

Veuillez le réduire à [mcve], afficher le code client et les octets transmis sur le réseau. De plus, gardez à l'esprit que "décimal non entier" n'a pas vraiment de sens avec le code que vous avez donné. Votre code n'utilise jamais le type 'decimal', donc vous ne savez pas vraiment ce que vous voulez dire. –

+0

53 est le codet Unicode (anciennement ASCII) pour le caractère '5'. Vous faites trop de décodage quelque part. – dlatikay

+0

Ya ... Je sais mais je découvre toujours quelle est la marche à suivre! –

Répondre

0

Supposons byteValue est 53, le codepoint du caractère '5'.

Puis

Convert.ToChar(byteValue) 

donnera 53. C'est très bien, les caractères en C# ont une valeur numérique, qui est leur ordinale dans la table de caractères.

Une façon de résoudre votre problème serait:

var a = int.Parse(ASCIIEncoding.ASCII.GetString(new byte[] { bytevalue })); 

Ou, encore une fois avec une certaine spéculation, plus probable:

var a = int.Parse(ASCIIEncoding.ASCII.GetString(data1)); 

Ici, la représentation numérique du chiffre de caractère « 5 » comme il vient sur le fil (comme 53), sera recherché dans la table ASCII, donnant "5", puis analysé dans l'entier désiré. Mais il ne résout pas les problèmes de racine avec le code entier, ce qui nécessiterait une planification plus approfondie de la façon dont les bits d'informations doivent être codés, transportés et ensuite décodés de manière fiable.

+0

Merci beaucoup @dlatikay! –