Я использую приложение Android для связи, отправки и получения сообщений через сокет TCP с помощью Java-приложения для ПК в той же локальной сети.Ниже приведен код Asynctask, который я использую в Android для отправки сообщения и получения ответа от ПК:
public class Client extends AsyncTask<Void, Void, Void> {
Context context;
String dstAddress;
int dstPort;
String msg;
Client(Context context, String addr, int port, String msg) {
this.context = context;
dstAddress = addr;
dstPort = port;
this.msg = msg;
}
String reply = "";
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
BufferedWriter dout = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//send request
dout.write(msg);
dout.flush();
dout.close();
//get response
reply = br.readLine();
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// DISPLAY REPLY CONTENT
Handler handler = new Handler(context.getMainLooper());
handler.post( new Runnable(){
public void run(){
Toast.makeText(context, "Server reply: " + reply ,Toast.LENGTH_LONG).show();
}
});
}
}
- Я показываю ответ ПК втост в onPostExcecute.
- Android отправляет сообщение через BufferedWriter, а приложение java на ПК получает его в BufferedReader.(работает нормально и проверено)
- ПК отправляет ответ через BufferedWriter на android после получения сообщения, где android получает ответ в BufferedReader, как показано ниже: br.readLine ().(ЗДЕСЬ проблема): Согласно отладке приложения ПК ответ отправляется успешно без каких-либо исключений IOException или ошибок, но на стороне Android строка ответа пуста, похоже, что она ничего не получила.Я действительно не знаю, что я делаю неправильно, и надеюсь, что кто-то может указать на то, что мне не хватает.
Ниже приведен поток сервера, который обрабатывает клиентский сокет, поток работает в основном всякий раз, когда serversocketпринимает сокет:
static class clientThread extends Thread {
Socket s = null;
clientThread(Socket s) //constructor
{
this.s = s;
}
@Override
public void run ()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //receiving data into a buffered reader
String dataIn = br.readLine(); // reading the buffered data into a string
System.out.println("received: " + dataIn);
//BufferedWriter dout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//dout.write("OK");
//dout.newLine();
PrintWriter dout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
if(dataIn.equals("Android client"))
{
dout.println("OK");
dout.flush();
System.out.println("OK sent");
}
dout.close();
br.close();
s.close();
}
catch (IOException e)
{ System.out.println("Error occured"); }
}
}
ТАК, чтобы суммировать программы, андроид отправляет сообщение «Клиент Android» (который сервер получает и печатает на консоли без проблем), теперь с ответом,Сервер также посылает "OK" без проблем, но сторона Android ничего не получает.ТАКЖЕ, как я уже говорил, если я удалю dout.close ();из асинхронной задачи Android после того, как я отправил сообщение, сервер получает сообщение ТОЛЬКО после завершения работы программы, я не понимаю, почему я должен закрыть его, чтобы сообщение было успешно отправлено.