Разъем Android TCP не получает данные - PullRequest
0 голосов
/ 28 мая 2018

Я использую приложение 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 после того, как я отправил сообщение, сервер получает сообщение ТОЛЬКО после завершения работы программы, я не понимаю, почему я должен закрыть его, чтобы сообщение было успешно отправлено.

1 Ответ

0 голосов
/ 29 мая 2018

Вы читаете строки, но не отправляете строки.Добавьте терминатор строки в сообщение, отправленное клиентом, или используйте BufferedWriter.newLine()flush() вместо закрытия буферизованного писателя.

...