본문 바로가기
안드로이드 자바

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

by teamnova 2023. 4. 18.
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();

            }
        });


    }
}