서버에서 파일 받아 넘기기

최지온·2023년 7월 12일

학술제

목록 보기
2/6
post-thumbnail

서론

Node.js의 Socket.io를 사용한다면…?

소켓 통신을 통해 .mtl, .obj 파일을 받아올 수 있다.

서버에서 클라이언트에게 실시간으로 데이터를 전송하게 된다.

Java에서는 socket.io-client-java 라이브러리를 사용해서 Socket.io 서버에 연결 가능하다.

이 라이브러리를 사용하면 Node.js 서버에서 전송된 .obj와 .mtl 파일 데이터를 받아올 수 있을 것으로 예상된다.

방법 1

실제로 돌려본 것이 아닌 예제를 통해 코드를 수정만 했다는 것을 알립니다.

먼저 안드로이드 스튜디오에서 socket.io-client.java를 사용하기 위해 build.gradle 파일에 다음 dependency를 추가한다.

build.gradle

dependencies {
    implementation ('io.socket:socket.io-client:1.0.0') {
        // excluding org.json which is provided by Android
        exclude group: 'org.json', module: 'json'
    }
}

그 후, 소켓을 생성하고 서버에 연결하는 코드를 작성한다.

// 액티비티 또는 다른 컨택스트
Context context = this;
IO.Options options = new IO.Options();
try {
    socket = IO.socket("http://your_server_address:port", options);
} catch (URISyntaxException e) {
    e.printStackTrace();
}

서버에서 데이터를 받아오기 위해 이벤트 리스너를 추가한다.

socket.on("objFileData", new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        ((Activity) context).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String objData = (String) args[0];  // assuming server sends string data
                UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", objData);
            }
        });
    }
});

socket.on("mtlFileData", new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        ((Activity) context).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String mtlData = (String) args[0];  // assuming server sends string data
                UnityPlayer.UnitySendMessage("GameObjectName", "AnotherMethodName", mtlData);
            }
        });
    }
});

마지막으로, 소켓을 사용해 서버에서 연결한다.

socket.connect();

이러한 방식으로 안드로이드 스튜디오에서 socket.io를 사용하여 Node.js 서버에서 실시간으로 데이터를 받아올 수 있을 거라고 예측된다.

이 데이터는 UnitySendMessage()를 통해 유니티로 전달될 수 있다.

방법 2

실제로 돌려본 것이 아닌 예제를 통해 코드를 수정만 했다는 것을 알립니다.

웹소켓은 일단 ‘example’로 빼놨습니다.

먼저, 프로젝트 수준의 build.gradle 파일에 Socket.IO 클라이언트 라이브러리의 종속성을 추가해야 한다.

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

그리고 앱 수준의 build.gradle 파일에 다음 종속성을 추가한다.

dependencies {
    ...
    implementation 'com.github.nkzawa:socket.io-client:0.6.0'
}

다음은 Socket.io 클라이언트를 설정하고 서버와 연결하는 코드를 작성한다.

import io.socket.client.IO;
import io.socket.client.Socket;

...

private Socket socket;

public void connectToServer() {
    try {
        // Create a new Socket instance and connect to the server
        socket = IO.socket("http://example.com");
        socket.connect();
        
        // Listen for events from the server
        socket.on(Socket.EVENT_CONNECT, args -> {
            // Connected to the server
            // You can now send events to the server
        }).on("my_event", args -> {
            // Received the "my_event" event from the server
            // args is an array of objects received from the server
        }).on(Socket.EVENT_DISCONNECT, args -> {
            // Disconnected from the server
        });
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}

위의 코드는 서버와 연결하고, 서버로부터 이벤트를 받는 기본적인 코드이다.

실제로 사용하려면 이 코드를 자신의 코드에 맞게 어느정도 수정이 필요하며, 받은 데이터를 Unity로 전달하는 코드도 필요하다.

Unity로 데이터를 전달하는 방법은 Unity와 안드로이드 앱이 어떻게 통신하냐에 따라 다르다.

이에 대한 정보가 필요하다.

마지막으로 이 코드는 네트워크 연결을 사용하므로

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

AndroidManifest.xml 파일에 인터넷 권한을 설정해야 한다.

profile
왕초보입니다

0개의 댓글