代码之家  ›  专栏  ›  技术社区  ›  TAHA SULTAN TEMURI

通过Tcp问题发送鼠标坐标

  •  0
  • TAHA SULTAN TEMURI  · 技术社区  · 8 年前

    我正在编写一个程序,我想把远程电脑的光标从我的电脑上移开,但在远程电脑上接收鼠标坐标时有一个小问题。由于延迟,远程机器上的tcp服务器接收到的数据在某些地方没有立即推送。这是我保存在文件中的代码和输出坐标,用于客户端发送和服务器接收。

    发送坐标的客户端代码。

    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)
            {
            }
        }
    }
    

    接收坐标的服务器代码

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

    从客户端发送坐标

    659#490 677#486 684#483 693#476 699#470 715#453 720#444

    653和492 659和490 669和489 684和483 699和470 709和460715#453720#444

    709和460715#453720#444 由于旧坐标未向前推,并附加了不适合鼠标位置的新坐标,请帮助。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Hadi Fooladi Talari    8 年前

    我认为在这种情况下,使用二进制格式更好。

    这样地:

    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());
            }
        }
    }
    
        2
  •  0
  •   John Wu    8 年前

    虽然在x和y之间有一个分隔符,但您不会在消息之间传递分隔符,而是依赖于计时,正如您所发现的那样,计时并不可靠。在y值之后添加一个分隔符或“消息结束”标记,并在服务器上对其进行解析,以确保不会同时收到两条消息。

        3
  •  0
  •   pm100    8 年前

    您的问题是,您将TCP视为块协议。事实并非如此,TCP是一种流协议。唯一的保证是您发送一些字节,并且它们将以相同的顺序接收。您可以发送一个100字节的区块,然后接收50个2字节的区块、1个100字节或100个1字节的消息。您需要能够读取流,知道需要多少数据,并在全部读取之前阻止。