Сообщения, отправленные с Android Server Socket, не принимаются такими приложениями, как Packet Sender в Ubuntu или Windows - PullRequest
2 голосов
/ 29 марта 2020

Я реализовал Android ServerSocket для работы с платежным устройством в полуинтегрированном режиме. Платежное устройство основано на Android, поэтому оно открывает сокет сервера и прослушивает входящие запросы через фиксированный порт. Я также создал фиктивное clientApp, где отправляю данные / запрос в платежное приложение, и оно отправляет ответ обратно в приложение очистки. Эта часть работает. Проблема возникает, когда я отправляю тот же запрос через приложение типа Paket Sender. В этом случае запрос принимается на стороне сервера, но когда я отправляю ответ клиенту (Packet Sender), он ничего не получает, когда соединение активно. Ниже приведен фрагмент кода, в котором я читаю данные и затем отправляю данные.

часть, где я создаю серверный сокет

ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
Socket socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();

Затем поток связи

 class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {
        //here the clientSocket is used to listen to incoming messages from client
        this.clientSocket = clientSocket;

        //here this tempClientSocket is used to send messages back to client  through sendMessage() methos which is defined below.
        tempClientSocket = clientSocket;

        try {
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
            showMessage("Error Connecting to Client!!");
        }
    }

    public void run() {

        while (!Thread.currentThread().isInterrupted()) {
            try {

                //we receive the incoming message in this read variable and from here we parse it and send the request to PayWorks SDK.
                String read = input.readLine();
                Log.e("READ"," Read->"+read);

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

* Используя метод ниже, мы отправляем сообщение обратно клиенту. У нас возникают проблемы в этой части, когда клиент является приложением * типа Packet Sender. * Поскольку мы не знаем, как работает основной анализ этих приложений, мы не можем его отладить. * Мы убедились, что переменная результата 'message' * здесь верна и что tempClientSocket не равен нулю. * Но после этого мы просто отправляем сообщение через сокет и больше не контролируем его. * Этот метод работает, если клиент реализован в мобильном устройстве и имеет аналогичную реализацию клиентского кода, как указано в * android руководстве по внедрению Socket для разработчиков. *

private void sendMessage(final String message) {
    try {
        Log.e("MESSAGES","Message is->"+message);
        if (null != tempClientSocket) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    PrintWriter out = null;
                    try {
                        out = new PrintWriter(new BufferedWriter(
                                new OutputStreamWriter(tempClientSocket.getOutputStream())),
                                true);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    out.println(message);

                }
            }).start();

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Может кто-нибудь помочь мне разобраться, что мне нужно изменить в методе sendMessage(), описанном выше, чтобы даже в таких приложениях, как Packet Sender, я мог видеть данные, отправленные обратно сервером. PS- Я перепробовал большинство решений, доступных на SO, в отношении этого и, следовательно, объявил это как последнее средство.

...