【问题标题】:Send Mouse Coordinates Over Tcp Issues通过 Tcp 问题发送鼠标坐标
【发布时间】:2017-07-07 18:17:40
【问题描述】:

我正在开发一个程序,在该程序中我想从我的电脑上移动远程电脑的光标,但是这里有一个小问题,在远程电脑上接收鼠标坐标,远程机器上的 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());
    }
}

从客户端发送坐标

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

在服务器上接收坐标 653 和 492 659 和 490 669 和 489 677 和 486 684 和 483 693 和 476 699 和 470 709 和 460715#453720#444 724和437

这里的问题是 709 和 460715#453720#444,因为旧坐标没有被向前推进并且附加了不适合鼠标位置的新坐标请帮助。

【问题讨论】:

  • 使用不缓冲和重新发送的 UDP 解决方案可能会更好地为您服务 - 只是尽可能快地获取信息。只要鼠标位置被一遍又一遍地发送,如果你偶尔丢包,没什么大不了的。
  • 谢谢@MichaelDorgan,我会努力的。

标签: c# winforms tcpclient


【解决方案1】:

我认为对于这种情况使用二进制格式更好。

像这样:

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】:

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

【讨论】:

    【解决方案3】:

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

    我会使用 c# 二进制写入器/读取器。这预先设置了长度信息,接收将等到它拥有所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多