2017-09-04 5 views
0

J'essaie de créer une application de chat LAN, utilisez les fonctions Send() et Receive() en C# pour envoyer et recevoir des messages. Mais le problème est que, lorsque le type d'utilisateur dans le message dans la console et appuyez sur Entrée clavier, ce contenu apparaît soudainement dans l'écran de la console avant WriteLine ma forme apparaît (par exemple: ce que je pensais est vous: bonjour)Application de chat TCP simple C#

enter image description here

Comment est-ce que je pourrais enlever la ligne "bonjour". Ce que j'attend est:
Client: Salut
vous: bonjour

Code pour serveur:

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

namespace SimpleTcpSrvr 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.OutputEncoding = Encoding.UTF8; 

      int recv; 

      byte[] data = new byte[1024]; 

      IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),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 clientep = (IPEndPoint)client.RemoteEndPoint; 

      Console.WriteLine("Connected with {0} at port {1}",clientep.Address,clientep.Port); 

      string welcome = "Welcome to my test server"; 

      data = Encoding.UTF8.GetBytes(welcome); 

      client.Send(data,data.Length,SocketFlags.None); 

      string input; 

      while (true) 
      { 

       data = new byte[1024]; 

       recv = client.Receive(data); 

       if (recv == 0) 

        break; 

       Console.WriteLine("Client: "+Encoding.UTF8.GetString(data, 0, recv)); 

       input = Console.ReadLine(); 

       Console.WriteLine("You: " + input); 

       client.Send(Encoding.UTF8.GetBytes(input)); 
      } 

      Console.WriteLine("Disconnected from {0}", clientep.Address); 

      client.Close(); 

      newsock.Close(); 

      Console.ReadLine(); 

     } 
    } 
} 

Code pour le 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 SimpleTcpClient 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.OutputEncoding = Encoding.UTF8; 

      byte[] data = new byte[1024]; 

      string input, stringData; 

      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; 
      } 

      int recv = server.Receive(data); 

      stringData = Encoding.UTF8.GetString(data, 0, recv); 

      Console.WriteLine(stringData); 

      while (true) 
      { 
       input = Console.ReadLine(); 

       if (input == "exit") 

        break; 

       Console.WriteLine("You: " + input); 

       server.Send(Encoding.UTF8.GetBytes(input)); 

       data = new byte[1024]; 

       recv = server.Receive(data); 

       stringData = Encoding.UTF8.GetString(data, 0, recv); 

       byte[] utf8string = System.Text.Encoding.UTF8.GetBytes(stringData); 

       Console.WriteLine("Server: "+stringData); 
      } 

      Console.WriteLine("Disconnecting from server..."); 

      server.Shutdown(SocketShutdown.Both); 

      server.Close(); 

      Console.WriteLine("Disconnected!"); 

      Console.ReadLine(); 

     } 
    } 
} 

Merci à tous!

+0

Non. Je ne veux pas masquer l'entrée lorsque je tape. Ce dont j'ai vraiment besoin, c'est de cacher la sortie après avoir appuyé sur Entrée clavier. Avez-vous vraiment lu ma question, mais avez-vous dit cela? –

+0

Vous devez exprimer clairement votre question - vous avez dit que votre sortie attendue était: Client: salut Vous: bonjour sans le salut entre les deux - donc je vous ai donné une réponse qui a fonctionné. – PaulF

Répondre

1

Vous pouvez essayer ceci, Réglez la position du curseur au début de la ligne précédente après ReadLine & puis remplacez la ligne par votre texte - dans votre cas, lorsque vous ajoutez "You:" votre chaîne de sortie sera plus longue que la chaîne d'entrée - si elle était plus petite, vous pouvez remplacer avec des espaces pour effacer les caractères en excès.

input = Console.ReadLine(); 
    Console.SetCursorPosition(0, Console.CursorTop-1); 
    Console.WriteLine("You: " + input); 
+0

juste au cas où: connaissez-vous une méthode similaire pour faire cela dans C-UNIX? – Thecave3

+1

@ Thecave3 - peut-être cela est utile: https://stackoverflow.com/questions/26423537/how-to-position-the-input-text-cursor-in-c – PaulF

+0

beaucoup, mais cela pourrait être un problème dans un code asynchrone comme un chat TCP parce que vous ne pouvez pas savoir quand le client vous enverra un message. En tout cas, merci beaucoup. – Thecave3