2017-01-13 5 views
2

Je commence à utiliser des objets liés au réseau en C# et je viens de terminer la création d'un modèle client/serveur. Le seul problème que j'ai, c'est que lorsque j'envoie des données, une partie est coupée. Par exemple, j'envoie le message "Hello there!", Et il vient d'envoyer "Hello".Les messages client/serveur TCP ne s'exécutent pas correctement

Exemple:

image

Mon code pour le serveur

public static TcpClient tcpcl = new TcpClient(); 
    public static NetworkStream netstream; 
    static void Main(string[] args) 
    { 
     while(!tcpcl.Connected) 
     { 
      try 
      { 
       tcpcl.Connect("127.0.0.1", 1234); 
      } 

      catch 
      { 

      } 
     } 
     netstream = tcpcl.GetStream(); 
     while(tcpcl.Connected) 
     { 
      byte[] buffer = new byte[tcpcl.ReceiveBufferSize]; 
      int unicodeData = netstream.Read(buffer, 0, tcpcl.ReceiveBufferSize); 
      string plainText = Encoding.Unicode.GetString(buffer, 0, unicodeData); 
      Console.WriteLine(plainText); 

     } 

     tcpcl.Close(); 
    } 

Mon code pour le client

public static TcpListener tcpl = new TcpListener(IPAddress.Any, 1234); 
    public static TcpClient tcpcl; 
    public static NetworkStream netstream; 
    static void Main(string[] args) 
    { 
     tcpl.Start(); 
     Console.WriteLine("Waiting for connection..."); 
     tcpcl = tcpl.AcceptTcpClient(); 
     netstream = tcpcl.GetStream(); 
     Console.WriteLine("Connection Established"); 
     while(tcpcl.Connected) 
     { 
      Console.WriteLine("Enter a message: "); 
      string ptMessage = Console.ReadLine(); 
      netstream.Write(Encoding.Unicode.GetBytes(ptMessage), 0, ptMessage.Length); 
      Console.WriteLine("Sent message"); 
     } 
     tcpcl.Close(); 
    } 

Répondre

1

Dans votre client, le changement:

string ptMessage = Console.ReadLine(); 
netstream.Write(Encoding.Unicode.GetBytes(ptMessage), 0, ptMessage.Length); 

Pour:

string ptMessage = Console.ReadLine(); 
byte[] bytes = Encoding.Unicode.GetBytes(ptMessage); 
netstream.Write(bytes, 0, bytes.Length); 

Le dernier paramètre à Write() devrait être la longueur du tableau d'octets retourné, pas la longueur de la chaîne d'origine.

+0

Quelle erreur stupide. Merci de votre aide! – rrrrrrrrrrrrrrrr

+0

Cela arrive. Parfois, nous avons juste besoin d'un ensemble supplémentaire d'yeux ... –