通过Tcp问题发送鼠标坐标

时间:2017-07-07 18:17:40

标签: c# winforms tcpclient

我正在制作程序,我想从我的电脑上移动远程电脑的光标但是这是一个小问题接收远程电脑上的tcp服务器接收的数据由于延迟没有立即推送这里的位置是我保存在文件中的代码和输出坐标,用于客户端发送和服务器接收。

发送坐标的客户端代码。

(click)="SetActive(menu)"

接收坐标的服务器代码

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

从客户端发送坐标

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 ,因为旧的坐标没有向前推,而且附加了不适合鼠标位置的新请求帮助。

3 个答案:

答案 0 :(得分:0)

虽然你有一个x和y之间的分隔符,但是你不能在消息之间传递分隔符,而是依赖于定时,而你发现它并不可靠。添加分隔符或"消息结束"在y值之后标记并在服务器上解析它以确保您没有同时收到两条消息。

答案 1 :(得分:0)

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

我会使用c#二进制编写器/阅读器。这取决于长度信息,接收将等到它拥有一切。

答案 2 :(得分:0)

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

像这样:

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