로컬 서버와 통신하기

Hwan·2023년 2월 16일
0

voicekeeper

목록 보기
5/16
post-thumbnail

구현할 내용

  • flask 로컬 서버와 통신 (test 용)
  • 서버에 녹음된 .m4a audio file을 전송
  • 전송이 성공했다는 응답을 받기

1. build.gradle

okhttp를 사용하므로 아래 추가하기

dependencies {
	implementation 'com.squareup.okhttp3:okhttp:4.9.0'
 }

2. RecordActivity

  • FileUploadUtils 클래스를 불러온다 (백그라운드 스레드를 이용하기 위함)
  • Handler를 이용하여, 녹음 완료 화면은 일정 시간 이후 종료하고 main으로 돌아간다.
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_record);

        // 번호, 시간, 파일명은 이전 화면(녹음)에서 받아왔다.
        // 다른 형식으로도 어떻게든 구할 수 있다면 filename에 기록
        // '------' 이후부터 보면 된다
        Intent intent = getIntent();
        String phoneNum = intent.getStringExtra("phoneNum");
        String getmin = intent.getStringExtra("min");
        String getsec = intent.getStringExtra("sec");
        String filename = intent.getStringExtra("filename");

        TextView callnum = findViewById(R.id.callnum);
        callnum.setText(phoneNum);

        TextView min = findViewById(R.id.min);
        if (getmin.length() < 2) {
            getmin = "0" + getmin;
        }
        min.setText(getmin);
        TextView sec = findViewById(R.id.sec);
        if (getsec.length() < 2) {
            getsec = "0" + getsec;
        }
        sec.setText(getsec);

        User user = new User(phoneNum, getmin + ":" + getsec, "현재시각");


		// ------------------------------------ 통신코드 시작
        // 서버통신
        File file = new File(filename);
        FileUploadUtils.send2Server(file);


        // 2.5초 후 메인화면으로 복귀
        Handler timer = new Handler();
        timer.postDelayed(new Runnable() {
            public void run() {
                Intent intent = new Intent(RecordActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }

        }, 2500); // 2.5초 후 main으로 복귀
    }

3. FileUploadUtils.java

  • activity가 아닌 일반 class
  • 서버에게 보내고 받는 동작을 모두 이곳에서 함
    (받는 것은 다른 포스트에서)
public class FileUploadUtils {

	public static void send2Server(File file){
    RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("files", file.getName(), RequestBody.create(MultipartBody.FORM, file))
                    .build();
            Request request = new Request.Builder()
                    // Server URL 은 본인 IP를 입력
                    // 이 코드에서는 flask 이용하여 로컬 웹서버를 불러옴
                    .url("http://172.23.252.81:5000/review_model")
                    .post(requestBody)
                    .build();

			// 타임아웃을 방지하기 위해 중간 3줄 설정
            // 타임아웃 문제 없다면 빼도 무방
            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(40, TimeUnit.SECONDS)
                    .writeTimeout(40, TimeUnit.SECONDS)
                    .readTimeout(40, TimeUnit.SECONDS)
                    .build();
                    
            client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String test = response.body().string();
                Log.d("TEST : ", test);
                // 서버에서 응답받은 결과를 Logcat에 출력
            }
        });
 }

0개의 댓글