안드로이드 자바

[Android][Java] Socket.io를 사용해서 서버와 통신하기

teamnova 2023. 4. 18. 12:00
728x90

 

오늘은 서버와 socket.io library를 사용해서 통신을 해보려고 합니다!

 socket.io library를 사용해서 서버와 연결을 하고 이벤트를 주고받는 예제입니다.

 

실행 결과입니다!

 

 

 

먼저 아래의 링크를 참고해서 서버 부분을 만들면 됩니다.

2023.04.01 - [Nodejs] - [ Nodejs ] socket.io 사용해서 서버와 데이터 주고받기

 

간단하게 클라이언트 코드 동작 순서를 먼저 설명해보겠습니다.

 

1. 서버와 연결할 때 사용할 socket 객체를 생성한다. 

여기서 사용하는 socket 객체는 서버와 이벤트를 주고받는 역할을 한다.

2. 서버가 전송한 이벤트를 받았을 때 실행할 동작을 .on() 함수를 사용해서 설정한다.

3. 서버에게 연결을 요청한다.

 

4. 서버와의 연결에 성공하면 onConnect Listener 의 call 함수가 호출된다.

5. 연결 성공이라는 토스트가 출력된다.

6. 호출된 함수에서 서버에게 server_hi 이름의 이벤트를 전송한다.

 

7. 서버가 전송한 client_hello 이벤트를 받으면 onClientHello Listener 의 call 함수가 호출된다.

8. 서버에게 받은 데이터("hello") 라는 토스트가 출력된다.

 

 

그리고 안드로이드 전체 코드입니다.

 

build.gradle에 추가할 코드입니다.

implementation ('io.socket:socket.io-client:2.0.0') {
        exclude group: 'org.json', module: 'json'
    }

 

먼저 매니페스트에 추가할 코드입니다.

    <uses-permission android:name="android.permission.INTERNET" />
    <application> 태그에     android:usesCleartextTraffic="true" 속성 추가

 

레이아웃 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:padding="8dp"
        android:text="서버와 연결 시작"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

자바 코드입니다.

public class MainActivity extends AppCompatActivity {


    Button 서버와연결요청버튼;
    Socket socket;

    Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {

            JSONObject msg = new JSONObject();
            try {
                msg.put("data", "hi");

            } catch (JSONException e) {
                e.printStackTrace();
            }


            SendData("연결 성공");

            socket.emit("server_hi", msg);

        }
    };


    Emitter.Listener onClientHello = new Emitter.Listener() {
        @Override
        public void call(Object... args) {


            JSONObject msg = (JSONObject) args[0];
            String data = null;
            try {
                data = msg.getString("data");
            } catch (JSONException e) {
                e.printStackTrace();
            }

            SendData(data);


        }
    };

    private void SendData(String data){
        Message message = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("message",data);
        message.setData(bundle);
        handler.sendMessage(message);
    }
    Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message message) {

            Bundle bundle = message.getData();
            String msg = bundle.getString("message","defaultValue");

            if(!msg.equals("defaultValue")){
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }

            return false;
        }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        서버와연결요청버튼 = findViewById(R.id.button);
        서버와연결요청버튼.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                socket = IO.socket(URI.create("서버 uri"));//"http://chat.socket.io"); //

                socket.on(Socket.EVENT_CONNECT, onConnect);
                socket.on("client_hello", onClientHello);
                socket.connect();

            }
        });


    }
}