본문 바로가기
Front-end/Android (안드로이드 앱 개발)

Android studio (안드로이드 스튜디오) Network 통신, retrofit2, stetho , 이클립스 서버와 통신

by javapp 자바앱 2020. 3. 17.
728x90

 

Android studio (안드로이드 스튜디오) Network 통신, retrofit2, stetho 

이 글은 이클립스 서버와의 통신을 다룬다.

 

Retrofit안드로이드에서 서버와의 통신을 위한 Square사의 라이브러리

HTTP API를 Java 인터페이스로 전환한다.

서버와의 통신을 할 때 AsyncTask 를 사용하지만 속도가 느리다는 단점이 있다.

그렇기 때문에 성능적으로 더 좋은 Restrofit 을 사용하려고 한다.

 

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

stetho 라이브러리는 페이스북에서 개발된 안드로이드 디버깅 툴이다.

 


build.gradle (:app)

 

retrofit

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

 

stetho

implementation 'com.facebook.stetho:stetho:1.5.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'

 

 

 


 

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

 


네트워크 통신 점검 : chrome://inspect/#devices  

 

public class MainActivity extends AppCompatActivity {
    String url = "https://api.github.com/";     //베이스 url
    TextView textView;
    MyService service;

    //Stetho Debugging address
    //chrome://inspect/#devices     //네트워크 통신 점검
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Stetho.initializeWithDefaults(this);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addNetworkInterceptor(new StethoInterceptor())
                .build();//StethoInterceptor 여기서 client 로 채간다

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(okHttpClient)           //Stetho
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        //베이스 url 뒤 서비스 파일 만들기 //인터페이스로
         service = retrofit.create(MyService.class);

        textView = findViewById(R.id.text1);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                requestUserRepo();
            }
        });
    }
    public void postUser(){
        Call<JsonObject> postUser = service.postUser("홍길동" ,25);
        postUser.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {

            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {

            }
        });
    }

    public void requestUserRepo(){
        Call<JsonObject> requestUserRepo = service.getUseRepositories("llsrrll96");
        requestUserRepo.enqueue(new Callback<JsonObject>() { //비동기 , 통신 보내기
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {

            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {

            }
        });
    }
}

 

public interface MyService 
{

	//베이스 url이후로 붙는다 // 요청할 주소 , {user 에 useName 이 들어간다}
	@GET("users/{user}/repos")
	Call<JsonObject> getUseRepositories(@Path("user")String useName); //Json 형식


	//body 데이터 실어 보내기
	@FormUrlEncoded
	@POST("users/repos")
	Call<JsonObject> postUser(@Field("username")String name,
	@Field("age")int age);
	//username 타입은 String , age 타입은 int
}

 

 

 

 

 

 

 


이클립스 서버와 통신

<간단한 이클립스 서버>

 

public class moblieMain {

             public static void main(String[] args) {

                           // TODO Auto-generated method stub

                           try {

                                        ServerSocket server = new ServerSocket(55555);

                                        //사용자 접속

                                        System.out.println("사용자 접속 대기");

                               Socket socket = server.accept();

                                        System.out.println("socket:" +socket);

                                       

                                        //입출력 스트림을 추출한다.

                                        InputStream is = socket.getInputStream();

                                        OutputStream os =socket.getOutputStream();

                                        DataInputStream dis = new DataInputStream(is);

                                        DataOutputStream dos = new DataOutputStream(os);

                                       

                                        dos.writeInt(100);

                                        dos.writeUTF("서버가 보낸 문자열");

                                       

                                        int intData = dis.readInt();

                                        String stringData = dis.readUTF();

                                                                  

                                        System.out.println("intData: "+ intData);

                                        System.out.println("stringData: "+ stringData);

 

                                        socket.close();

                                        server.close();

                           } catch (IOException e) {

                                        // TODO Auto-generated catch block

                                        e.printStackTrace();

                           }

             }

}

 

 

 

안드로이드 스튜디오

<메인.java>

public class MainActivity extends AppCompatActivity {
    TextView textview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textview = findViewById(R.id.textView);
    }

    public void btnThread(View view)
    {
        //이클립스와 연결시켜 이클립스에서 만든 서버와 통신 가능
        //이클립스 moblieMain 클래스
        NetwordThread networdThread = new NetwordThread();
        networdThread.start();
    }

    class NetwordThread extends  Thread{
        @Override
        public void run() {
            try {
                //서버 접속
                final Socket socket = new Socket("192.168.0.3",55555); //localhost = 애뮬레이터다
                //입출력 스트림 추출
                InputStream is = socket.getInputStream();
                OutputStream os =socket.getOutputStream();
                DataInputStream dis = new DataInputStream(is);
                DataOutputStream dos = new DataOutputStream(os);

                //받기
                final int intData = dis.readInt();
                final String stringData = dis.readUTF();

                //보내기
                dos.writeInt(100);
                dos.writeUTF("앱에서 보낸 문자열");

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textview.setText(""+intData+"\n");
                        textview.append(stringData);                    }
                });

                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 


서버랑

데이터 타입이 같아야되고

콜백 형태에 비동기로 실행된다. 그래서

동기화 하기가 힘들다.

댓글