Ajuda com Socket em Java (pc-android)

0 respostas
servidorandroidjava
Gilian_Marques

Estou escrevendo um app basico para controlar meu pc atraves do celular. Para conectar cliente e servidor eu uso sockets. Notei que ao mover o cursor do mouse remotamente a partir do telefone da um delay muito grande e as vezes o mouse nem meche e atribuo isso ao fato de ter que inicializar um socket toda vez que o usuario derrapa o dedo na tela pixel por pixel. fiz algumas buscas rapidas na internet pra ver se achava alguma alternativa ao socket ou um jeito de manter a conexao sempre aberta entre cliente e servidor pra poder trocar dados com mais velocidade mas n encontrei nada.

N tenho experiencia com sockets e gostaria de saber se tem algum jeito de manter a conexao sempre aberta entre cliente e servidor usando sockets ou se tem algum outro jeito mais eficiente de enviar dados para o servidor de forma mais rapida para acabar com o delay.

Código que uso para comunicar Cliente e servidor (CLIENTE)

public static void enviarComando(final Evento evento) {
    if (portaTravada) return;
    portaTravada = true;
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket = new Socket(ip, porta); // inicializo uma nova instancia de socket toda vez...
                printWriter = new PrintWriter(socket.getOutputStream());
                printWriter.write(new Gson().toJson(evento));
                printWriter.flush();
                printWriter.close();
                socket.close();
                Thread.sleep(7);   /* impede que uma nova conexao seja iniciada a cada pixel percorrido pelo dedo 
      do usuario ao mover o mouse*/
            } catch (IOException | InterruptedException e1) {
                e1.printStackTrace();
            }
            portaTravada = false;   /* travar a porta foi a maneira que encontrei de diminuir 
 um pouco as travadas no pc ao mecher o mouse*/
        }

    }).start();


}

Evento de toque que intercepta o movimento do usuario e envia pro PC (AINDA CLIENTE)

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    int action = motionEvent.getAction();
    int x = (int) motionEvent.getX();
    int y = (int) motionEvent.getY();

    animClick(motionEvent);

    if (action == MotionEvent.ACTION_MOVE && !podeSerUmCiique) {
        System.out.println("Mouse.onTouch MOVE");
        rippleBackground.setX(motionEvent.getRawX() - rippleBackground.getMeasuredWidth() / 2);
        rippleBackground.setY(motionEvent.getRawY() - rippleBackground.getMeasuredHeight() / 2);


        // calculo a difirença pra saber qto o ponteiro do mouse se mecheu

        int moveX = x - ultimoX;
        int moveY = y - ultimoY;

        ultimoX = (int) motionEvent.getX();
        ultimoY = (int) motionEvent.getY();

        moveX = (int) (moveX * 2); // aumento a sensibilidade do deslizar
        moveY = (int) (moveY * 2);

        int def = 50;
        if (moveX > def || moveX < -def || moveY > def || moveY < -def) return true;
        AppPatterns.enviarComando(new Evento(Evento.MOUSE_DRAG, Evento.TAG_MOUSE, moveX, moveY));

    }
    return true;
}

Codigo responsavel por receber os dados do cliente (SERVIDOR (Meu PC))

void escutar() {

    new Thread(() -> {
        while (true) {
            try {
                serverSocket = new ServerSocket(porta);
                socket = serverSocket.accept();
                inputStreamReader = new InputStreamReader(socket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);
                String mensagem = bufferedReader.readLine();
                inputStreamReader.close();
                bufferedReader.close();
                socket.close();
                serverSocket.close();
                Evento evt = new Gson().fromJson(mensagem, Evento.class);
                analisarMensagem(evt);
                //

            } catch (IOException ex) {
                Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }).start();
}
Criado 26 de setembro de 2017
Respostas 0
Participantes 1