본문 바로가기

CSE/Android

Android 에서 특정 네트워크 인터페이스를 이용하여 통신하기

반응형

안녕하세요! 이번 포스트에선 안드로이드의 네트워킹 기능에 대해 더 알아보려고 합니다. 우리가 주목할 주요 기능은 애플리케이션이 외부 네트워크와 통신하기 위한 네트워크 인터페이스를 지정할 수 있게 하는 API들입니다.

ConnectivityManager와 bindProcessToNetwork

우선 ConnectivityManager로 시작해봅시다. 이 클래스는 네트워크 연결 상태를 제공하고 연결 상태가 변경될 때 애플리케이션에 이를 업데이트합니다. 이 클래스에서 오늘 얘기할 메소드는 bindProcessToNetwork입니다.

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = ... // 원하는 네트워크
cm.bindProcessToNetwork(network);

bindProcessToNetwork를 사용하면 애플리케이션이 Network 객체를 자신의 네트워크 트래픽에 전용으로 할당할 수 있습니다. 따라서 애플리케이션의 모든 트래픽은 지정된 네트워크를 통해 라우팅됩니다. 즉, default network 가 mobile network 임에도 Wi-Fi network를 사용하도록 명시적으로 정해줄 수 있다는 것입니다.

Network 객체 얻기

bindProcessToNetwork와 함께 사용할 Network 객체를 어떻게 얻을 수 있는지 궁금할 수 있습니다. 이와 관련해서 참조할 만한 글을 작성해두었으니 참조하시면 좋을 것 같습니다.

1. Android ConnectivityManager와 NetworkCallback
2. DefaultNetworkCallback, Listen 타입과 Request 타입 Network Callback 이해하기


간략한 예시로 network 객체를 얻는 방법은 아래와 같이 있습니다.:

  1. NetworkCallback
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
   @Override
   public void onAvailable(Network network) {
      // 여기에서 네트워크 객체를 사용합니다.
   }
};
  1. getActiveNetwork
Network activeNetwork = cm.getActiveNetwork();

Network 객체를 얻었다면, Network 클래스의 메소드를 이용해 네트워크 트래픽을 제어할 수 있습니다.

Network와 그 메소드들: bindSocket, getSocketFactory, openConnection

Network 클래스는 네트워크 인터페이스를 나타냅니다. 이 클래스에는 몇 가지 핵심 메소드가 있습니다:

  1. bindSocket(Socket socket): 지정된 Socket을 이 Network에 바인드하여 Socket으로부터의 모든 데이터 트래픽이 이 Network를 통해 전송되도록 합니다.
Network network = ... // Your Network
Socket socket = new Socket();
network.bindSocket(socket);
OutputStream os = socket.getOutputStream();
os.write("Hello, world!".getBytes());
os.close();
socket.close();
  1. getSocketFactory(): 이 Network에 바인딩된 Socket을 생성하는 SocketFactory를 반환합니다.
SocketFactory sf = network.getSocketFactory();
Socket socket = sf.createSocket("example.com", 80);
OutputStream os = socket.getOutputStream();
os.write("Hello, world!".getBytes());
os.close();
socket.close();
  1. openConnection(URL url): 이 네트워크에서 URLConnection을 연다. 이를 이용하여 InputStream 또는 OutputStream을 생성할 수 있습니다.
URL url = new URL("http://example.com");
URLConnection connection = network.openConnection(url);
InputStream is = connection.getInputStream();
// 여기에서 InputStream 사용
is.close();

이러한 메소드들을 활용하면 애플리케이션은 명시적으로 특정 네트워크 인터페이스를 통해 네트워크 트래픽을 전송할 수 있어, 데이터가 올바르게 라우팅되는 것을 보장할 수 있습니다.

안드로이드의 네트워킹 기능에 대해 아주 단편적인 내용들만 작성된 것으로 이와 관련된 클래스와 메소드는 훨씬 더 많습니다. 항상 안드로이드 공식문서를 참조하시고 필요한 기능들을 테스트 해보세요.

반응형