服务器(Java)和客户端(Android)远程连接延迟

时间:2014-04-06 03:54:13

标签: java android remote-control remote-connections

我一周前开发了远程鼠标。我测试了很多,但我无法解决与OS相关的神秘问题。 (Remote app, Difference of speed between Win7 and Win8

所以我用简单的代码测试了PC和Android之间的远程连接。 (请参阅下面的代码和结果。)它们之间有一点延迟时间(约200ms)。我想这就是我觉得我的鼠标移动缓慢的原因。所以我想缩小差距。请给我任何方式去。而且我想知道这种情况只会赢7场。当我尝试赢8时,差距很小。

我将不胜感激任何帮助。感谢您阅读:)

客户端:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Touch = (TextView) findViewById(R.id.Touch);
    BtnCnt = (Button) findViewById(R.id.BtnConnect);

    Touch.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent me) {
            try {
                c = Calendar.getInstance();
                hour = c.get(Calendar.HOUR);
                minute = c.get(Calendar.MINUTE);
                second = c.get(Calendar.SECOND);
                msecond = c.get(Calendar.MILLISECOND);

                String CurTime = "(Android)" + hour + ":" + minute + ":"
                        + second + ":" + msecond;

                Touch.setText(CurTime);
                dos.writeUTF(CurTime);
                dos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
    });

    BtnCnt.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            Touch.setText("Connecting...");

            Thread T1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        socket = new Socket(IP, PORT);
                        dos = new DataOutputStrea(socket.getOutputStream());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

            T1.start();
        }
    });
}

服务器端:

try {
    ss = new ServerSocket(PORT);
    System.out.println("Server starts...");
    s = ss.accept();

    if (s.isConnected()) {
        System.out.println("Client is connected.");
        dis = new DataInputStream(s.getInputStream());
        while (true) {
            c = Calendar.getInstance();
            c.getTime();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS");
            data = dis.readUTF();
            System.out.println("(Java)" + sdf.format(c.getTime())
                    + " - " + data);
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

结果:

(Java)12:24:04:693 - (Android)0:24:4:319
(Java)12:24:04:693 - (Android)0:24:4:342
(Java)12:24:04:693 - (Android)0:24:4:351
(Java)12:24:04:693 - (Android)0:24:4:369
(Java)12:24:04:694 - (Android)0:24:4:386
(Java)12:24:04:694 - (Android)0:24:4:403
(Java)12:24:04:694 - (Android)0:24:4:421

= Java收到的时间 - Android发送时间

1 个答案:

答案 0 :(得分:0)

我不明白你为什么要在每次迭代的线程运行中创建一个套接字 在这个范围内,你是在线程中每次运行调用创建一个可编号的套接字。 我认为经过一段时间后,该线程会延迟时间增加。

 Thread T1 = new Thread(new Runnable() {
            public void run() {
                try {
                    socket = new Socket(IP, PORT);
                    dos = new DataOutputStrea(socket.getOutputStream());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

而不是这个我认为你应该有一个套接字并将此套接字上的流发送到服务器。

更新

另一种方法是使用REST来做到这一点,我使用Volley它是一个伟大,甜蜜和简单的REST框架。由Google创建