Отправить нажатия клавиш с устройства Android на ПК без «заикания» - PullRequest
0 голосов
/ 27 декабря 2011

Я работаю над приложением для Android, которое при нажатии кнопки в приложении отправляет нажатие клавиши в список серверов на ПК. Все работает нормально, ожидайте проблемы с выходом "заикания" при быстром нажатии кнопки. Если на клиенте нажимать быстро, сервер «заикается» и иногда просто перестает отвечать на запросы. Используемая треска чрезвычайно проста. Для простого?

Серверная часть:

    ServerSocket welcomeSocket = new ServerSocket(6789);
        while(true)
         {

            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient =    new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

           keyin = inFromClient.readLine();
              robby.translateAndForward(keyin);
             }

      }
catch (Exception ex)

.... На клиенте

public class ImageBoundListener implements OnTouchListener {
private ImageView view;
private static   PadClient client;

Обработчик события On Touch

@Override
    public boolean onTouch(View view, MotionEvent event) {
        int action = event.getAction() & MotionEvent.ACTION_MASK;;
if (client==null)
{
    client=new PadClient();
}
if (action==MotionEvent.ACTION_DOWN)
{
    client.sender("A");
}

         Integer actionCode = action & MotionEvent.ACTION_MASK;
    Log.d(actionCode.toString()," Event occured on: "+view.getTag());


return true;         
         }


    }

Фактическая реализация отправки

    try{
    Socket clientSocket = new Socket("192.168.1.104", 6789);
      DataOutputStream outToServer = new     DataOutputStream(clientSocket.getOutputStream());
     System.out.println("Writing bytes to the server..");
      outToServer.writeBytes(send);
      clientSocket.close();
}

Не уверен, куда идти отсюда ...

1 Ответ

1 голос
/ 27 декабря 2011

Есть несколько проблем с вашим кодом:

Ваш код открывает соединение при каждом нажатии кнопки. При быстром нажатии - множество соединений будет открыто одновременно между клиентом и сервером. Было бы лучше создать одно постоянное соединение и отправить через него все данные.

Также вы можете добавить некоторую буферизацию на стороне клиента. Я имею в виду, что данные от нескольких нажатий кнопок будут объединены в один пакет данных и отправлены на сервер.

При решении проблем со связью между клиентом и сервером очень важно вести журнал сетевого ввода-вывода (что было отправлено и что было получено с обеих сторон).

Ваша серверная сторона может выглядеть так:

try {
    ServerSocket welcomeSocket = new ServerSocket(6789);
    Socket connectionSocket = welcomeSocket.accept();
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    while(true) {         
        keyin = inFromClient.readLine();
        Log.d("SERVER"," received: '" + keyin + "'");
        robby.translateAndForward(keyin);
    }
}
catch (Exception ex) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...