마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 파이썬 소켓통신 질문입니다

0 추천

안드로이드에서 파이썬서버로 요청시마다 값을 받아오는 앱을 구현중인데

안드로이드에서 값 전송이 한번밖에 안되네요 ㅠㅠ

클라이언트를 파이썬으로두고 파이썬 서버로 전송하면 여러번 값 전송이 되는데

안드로이드에서만 전송이 한번밖에 안되네요 왜인지 아시는분 있으실까요?ㅠㅠ

파이썬 서버는 잘되는걸 확인해서 안드로이드 자바 코드만 올려요 ㅠㅠ

private class Connect extends AsyncTask< String , String,Void > {
    private String output_message;
    private String input_message;

    @Override
    protected Void doInBackground(String... strings) {
        try {

            client = new Socket(SERVER_IP, 8080);
            dataOutput = new DataOutputStream(client.getOutputStream());
            dataInput = new DataInputStream(client.getInputStream());
            output_message = strings[0];
            dataOutput.writeUTF(output_message);
            dataOutput.flush();
            dataOutput.close();
        } catch (UnknownHostException e) {
            String str = e.getMessage().toString();
            Log.w("discnt", str + " 1");
        } catch (IOException e) {
            String str = e.getMessage().toString();
            Log.w("discnt", str + " 2");
        }

        while (true){
            try {
                byte[] buf = new byte[BUF_SIZE];
                int read_Byte  = dataInput.read(buf);
                input_message = new String(buf, 0, read_Byte);
                if (!input_message.equals(STOP_MSG)){
                    publishProgress(input_message);
                }
                else{
                    break;
                }
                Thread.sleep(2);
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(String... params){

        read_text_view.setText(""); // Clear the chat box
        read_text_view.append("받은 메세지: " + params[0]);
    }
}//서버 통신 클래스
smt3225 (150 포인트) 님이 2021년 10월 27일 질문

1개의 답변

0 추천
 
채택된 답변
아직도 AsyncTask 를 사용하시 분들이 의외로 있네요. 이미 deprecated 된 클래스라, Retrofit, RxJava같은 걸로 갈아 타시는게 좋습니다.

어쨋거나, AsyncTask는 간단한 백그라운드 작업을 서포트하기 만들어진 클래스입니다. 위처럼 doInBackground에서 무한루프를 돌리셔도 일정 시간이 지나면 AsyncTask 종료될 걸로 보입니다. 앱이 실행되는 동안 계속해서 백그라운드 작업을 실행하시려면 서비스같은 걸 이용해서 처리하거나 Timer, WorkManager같은 거로 스케쥴링을 해주어야 합니다.

그리고 안드로이드에서 Thread.sleep을 사용하면 화면이 얼어버릴 가능성이 크기 때문에 사용하지 않는게 좋습니다.
spark (226,420 포인트) 님이 2021년 10월 27일 답변
smt3225님이 2021년 10월 27일 채택됨
답변 감사합니다! AsyncTask를 안쓰는 추세군요 ㅠㅠ 학부생 졸작만드느라 구글링해서 가장많이 나오는거 쓰다보니 썻네요 ㅎㅎ

밑에 링크보고 nonBlocking?식으로 소켓통신 했더니 해결됐습니다 ㅎㅎ 감사합니다
https://www.masterqna.com/android/88141/wifi-read-1%EB%B2%88%EB%A7%8C-%EB%90%98%EB%8A%94-%ED%98%84%EC%83%81
...