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