1

我不知道这是否真的是一个问题,但我创建了一个应用程序,通过 wifi 或便携式热点控制计算机上的鼠标光标。问题是:当我用 wifi 接入点连接我的电脑和我的安卓设备时,光标移动不如我将电脑连接到安卓设备的便携式热点时流畅。我尝试了两部不同的安卓手机,也遇到了同样的问题。以下是我在应用程序上使用的 TCP 代码:

    @Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();

    switch (action) {
    case MotionEvent.ACTION_DOWN:

        xStart = event.getRawX();
        yStart = event.getRawY();
        if (mess.equals("click")) {
            mess="leftdown";
        }
        break;

    case MotionEvent.ACTION_MOVE:
        xMove = event.getRawX();
        yMove = event.getRawY();
        distanceX = (xStart - xMove);
        distanceY = (yStart - yMove);
        sendCmd(distanceX, distanceY);
        xStart = xMove;
        yStart = yMove;
        mess="move";
        sendMess(mess);
        break;

    case MotionEvent.ACTION_UP:
        break;
    }
    return detector.onTouchEvent(event);
}

void sendCmd(float distanceX, float distanceY) {
    try {
        out.writeFloat(distanceX);
        out.writeFloat(distanceY);

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

void sendMess(String mess) {
    try {
        out.writeUTF(mess);

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这是我在服务器上使用的 TCP 代码

    @Override
public void run() {

    // System.out.println("Connected");
    // pixel, velocity

    float x = 0, y = 0;
    try {

        Robot mouse = new Robot();
        PointerInfo a;

        Point b;
        String mess;
        int xx, yy;

        DataInputStream in = new DataInputStream(server.getInputStream());
        x = in.readFloat();
        y = in.readFloat();
        mess = in.readUTF();
        System.out.println(x + "-" + y);
        if (mess.equals("click")) {
            mouse.mousePress(InputEvent.BUTTON1_MASK);
            mouse.mouseRelease(InputEvent.BUTTON1_MASK);

        } else if (mess.equals("scroll")) {

        } else if (mess.equals("leftdown")) {
            mouse.mousePress(InputEvent.BUTTON1_MASK);
        } else if (mess.equals("leftup")) {
            mouse.mouseRelease(InputEvent.BUTTON1_MASK);
        } else if (mess.equals("right")) {
            mouse.mousePress(InputEvent.BUTTON3_MASK);
            mouse.mouseRelease(InputEvent.BUTTON3_MASK);
        } else if (mess.equals("move")) {
            a = MouseInfo.getPointerInfo();
            b = a.getLocation();
            xx = (int) b.getX();
            yy = (int) b.getY();
            mouse.mouseMove(xx - (int) x, yy - (int) y);
            mouse.delay(7);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

由于某些特殊原因,请原谅我无法在我的 java 文件中发布整个代码。

4

2 回答 2

1

您不应该期望 TCP 的低延迟行为,因为它不是为此目的而设计的。

实际上,称为 nagle 算法的东西通常会增加延迟以提高批量效率。您可能有能力在某些系统上禁用它,但在其他系统上则不能 - 通常您需要在连接的两端都这样做以避免由此产生的延迟。

此外,wifi 网络不保证延迟,因此您可以看到差异很大。诸如接入点的实施细节之类的事情会改变效率,RF 环境也是如此——我已经看到该国的延迟远低于大城市的中心。此外,当您使用手机作为接入点时,您会限制所需的 wifi 行程次数 - 而不是手机接入点计算机,它只是手机计算机。

所以你可能会看的东西:

  • 切换到UDP而不是TCP,并实现自己的低延迟可靠性(ack/resend)机制
  • 选择没有其他用户的 wifi 频道(如果可能)
  • 如果您必须继续使用 TCP,请禁用 nagle
  • 在接入点模式下使用手机(尽管这可能是不可取的,因为您可能不希望 PC 的其他流量以这种方式进行)
  • 使用蓝牙代替wifi
于 2013-03-14T15:10:47.853 回答
0

我尝试使用 UDP 方法,但客户端有时会丢失数据包,这会导致我的服务器出现一些错误。几个小时后,我找到了一个适合我的解决方案,我不确定它是否适用于其他人。对客户端套接字和服务器套接字使用 setTcpNoDelay()。

于 2013-03-17T05:15:35.143 回答