2017-07-07 4 views
0

Je travaille sur un programme dans lequel je veux déplacer le curseur du PC distant de mon pc mais voici un petit problème de réception des coordonnées de la souris sur pc distant les données reçues par le serveur tcp sur la machine distante retarder ne pas pousser immédiatement sur certains endroits ici est le code et les coordonnées de sortie que j'ai enregistré dans un fichier à la fois pour l'envoi du client et la réception du serveur.Envoyer les coordonnées de la souris sur TCP Problèmes

Code client pour l'envoi de coordonnées.

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (isconnected) 
    { 
     try 
     { 
      NetworkStream serverStream = clientSocket.GetStream(); 
      this.Cursor = new Cursor(Cursor.Current.Handle); 
      int pX = Cursor.Position.X; 
      int pY = Cursor.Position.Y; 
      byte[] outStream = System.Text.Encoding.ASCII.GetBytes($"{pX}#{pY}"); 
      System.IO.File.AppendAllText(@"F:\DOWNLOAD\client.txt", $"{pX}#{pY}" + Environment.NewLine); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
} 

Code de serveur pour recevoir les coordonnées

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
{ 
    try 
    { 
     // Translate data bytes to a ASCII string. 
     // Receive mouse coordinates here 
     data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 

     string Coordinates = data.ToString(); 
     string X = Coordinates.Substring(0, Coordinates.IndexOf('#')); 
     string Y = Coordinates.Substring(Coordinates.IndexOf('#') + 1); 
     coordvalue.Invoke((MethodInvoker)(() => coordvalue.Text = "")); 

     coordvalue.Invoke((MethodInvoker)(() => coordvalue.Text = $"{X} and {Y}")); 
     coordvalue.Invoke((MethodInvoker)(() => coordvalue.Update())); 

     // Change coordinates 
     System.Windows.Forms.Cursor.Position = new Point(Convert.ToInt32(X), Convert.ToInt32(Y)); 
     Cursor.Clip = new Rectangle(this.Location, this.Size); 
     System.IO.File.AppendAllText(@"F:\DOWNLOAD\server.txt", $"{X} and {Y}" + Environment.NewLine); 

    } 
    catch (Exception E) 
    { 
     // MessageBox.Show(E.ToString()); 
    } 
} 

Envoyer Coordonnées du client

653 # 492 659 # 490 669 # 489 677 # 486 684 # 483 693 # 476 699 # 470 709 # 460 715 # 453 720 # 444 724 # 437

Recevoir les coordonnées sur le serveur 653 et 492 659 et 490 669 et 489 677 et 486 684 et 483 693 et ​​476 699 et 470 709 et 460715 # 453720 # 444 724 et 437

problème Voici avec 709 et 460715 # 453720 # 444 parce que les vieux coordonnées ne sont pas poussés vers l'avant et avec une nouvelle qui annexant ne convient pas pour la position de la souris S'il vous plaît aider.

+0

Vous pourriez être mieux servis avec une solution UDP qui ne cache pas les Renvoyez - obtient juste plus d'informations aussi vite que possible. Tant que la position de la souris est envoyée à plusieurs reprises, si vous laissez tomber un paquet de temps en temps, pas de problème. –

+0

Merci @MichaelDorgan Je vais essayer. – DumpsterDiver

Répondre

0

alors que vous avez un délimiteur entre x et y, vous ne passez pas de délimiteur entre les messages et vous vous fiez à la temporisation qui, comme vous l'avez découvert, n'est pas fiable. Ajoutez un délimiteur ou un marqueur "fin de message" après la valeur y et analysez-le sur le serveur pour vous assurer que vous n'avez pas reçu deux messages en même temps.

0

votre problème est que vous traitez TCP comme un protocole de bloc. Ce n'est pas le cas, TCP est un protocole de streaming. La seule garantie est que vous envoyez des octets et qu'ils seront reçus dans le même ordre. Vous pouvez envoyer un bloc de 100 octets et recevoir 50 blocs de 2 octets, ou 1 100 octets, ou 100 messages de 1 octet. Vous devez être capable de lire le flux et de savoir combien de données vous avez besoin et de bloquer jusqu'à ce que vous ayez tout lu.

J'utiliserais C# binary writer/reader. Cela précède les informations de longueur et le reçu attendra qu'il ait tout.

0

Je pense que pour cette situation, l'utilisation du format binaire est meilleure.

Comme ceci:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (isconnected) 
    { 
     try 
     { 
      NetworkStream serverStream = clientSocket.GetStream(); 

      var BW = new BinaryWriter(serverStream); 

      this.Cursor = new Cursor(Cursor.Current.Handle); 
      int pX = Cursor.Position.X; 
      int pY = Cursor.Position.Y; 
      BW.Write(pX); 
      BW.Write(pY); 
     } 
     catch (Exception ex) 
     { 


     } 
    } 

} 

private void RecieveLoop() 
{ 
    if (clientSocket.Available > 0) 
    { 
     NetworkStream serverStream = clientSocket.GetStream(); 
     var BR = new BinaryReader(serverStream); 

     try 
     { 
      int X = BR.ReadInt32(); 
      int Y = BR.ReadInt32(); 


      coordvalue.Invoke((MethodInvoker)(() => coordvalue.Text = "")); 

      coordvalue.Invoke((MethodInvoker)(() => coordvalue.Text = $"{X} and {Y}")); 
      coordvalue.Invoke((MethodInvoker)(() => coordvalue.Update())); 
      ////change coordinates 
      System.Windows.Forms.Cursor.Position = new Point(Convert.ToInt32(X), Convert.ToInt32(Y)); 
      Cursor.Clip = new Rectangle(this.Location, this.Size); 
      System.IO.File.AppendAllText(@"F:\DOWNLOAD\server.txt", $"{X} and {Y}" + Environment.NewLine); 

     } 
     catch (Exception E) 
     { 

      // MessageBox.Show(E.ToString()); 
     } 
    } 
} 
+0

Pourquoi envoyez-vous à la fois la représentation binaire et chaîne sur la connexion? –

+0

Oui, vous avez raison. La représentation de chaîne doit être supprimée. –