Я реализовал 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, в отношении этого и, следовательно, объявил это как последнее средство.