1

これが本当に問題なのかどうかはわかりませんが、wifiまたはポータブルホットスポットを介してコンピューター上のマウスカーソルを制御するアプリを作成しました。問題は次のとおりです。PCとAndroidデバイスをwifiアクセスポイントに接続すると、PCをAndroidデバイスのポータブルホットスポットに接続したときほどカーソルの動きがスムーズになりません。2つの異なるAndroidスマートフォンで試してみましたが、同じ問題が発生しました。アプリで使用する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はその目的のために設計されていないため、TCPの低遅延動作を期待するべきではありません。

実際、nagleアルゴリズムと呼ばれるものは、バルク効率を向上させるためにレイテンシーを増加させることがよくあります。一部のシステムでは無効にできる場合がありますが、他のシステムでは無効にできない場合があります。多くの場合、結果として生じる遅延を回避するために、接続の両端で無効にする必要があります。

また、wifiネットワークは遅延を保証しないため、遅延が大きく異なることがわかります。アクセスポイントの実装の詳細のようなものは、RF環境と同様に、効率を変える可能性があります-私は、大都市の真ん中よりも国の方がはるかに低いレイテンシーを見てきました。また、電話をアクセスポイントとして使用する場合は、必要なWi-Fiトリップの数を制限します。電話アクセスポイントコンピューターではなく、電話コンピューターになります。

だからあなたが見るかもしれないもの:

  • TCPではなくUDPに切り替えて、独自の低遅延の信頼性(ACK /再送)メカニズムを実装します
  • 他のユーザーなしでwifiチャネルを選択する(可能な場合)
  • TCPを使用する必要がある場合は、nagleを無効にします
  • 電話をアクセスポイントモードで使用します(ただし、PCの他のトラフィックをそのように移動させたくない場合があるため、これはおそらく望ましくありません)。
  • Wi-Fiの代わりにBluetoothを使用する
于 2013-03-14T15:10:47.853 に答える
0

UDP メソッドを使用してみましたが、クライアントからパケットが失われることがあり、サーバーでいくつかのエラーが発生しました。数時間後、自分に合った解決策を見つけましたが、他の人にとってはうまくいくかどうかはわかりません。クライアント ソケットとサーバー ソケットの両方に setTcpNoDelay() を使用します。

于 2013-03-17T05:15:35.143 に答える