본문 바로가기

프로그래밍

안드로이드폰과 서버 사이의 통신

반응형

안드로이드에서 사용가능한 통신의 종류는 몇가지 없다.

소켓통신
RPC
소켓통신의 JAVA에서 널리 사용되는 소켓통신과 동일하다.

서버측 소켓통신 코드 ( 아래 )
더보기

 

public class TCPServer implements Runnable {

 

    public static final int ServerPort = 9999;

    public static final String ServerIP = "xxx.xxx.xxx.xxxx";

 

    @Override

    public void run() {

        // TODO Auto-generated method stub

        try {

            System.out.println("S: Connecting...");

            ServerSocket serverSocket = new ServerSocket(ServerPort);

 

            while (true) {

                Socket client = serverSocket.accept();

                System.out.println("S: Receiving...");

 

                try {

                    BufferedReader in = new BufferedReader(

                    new InputStreamReader(client.getInputStream()));

                    String str = in.readLine();

                    System.out.println("S: Received: '" + str + "'");

                    PrintWriter out = new PrintWriter(new BufferedWriter(

                    new OutputStreamWriter(client.getOutputStream())),true);

                    out.println("Server Received " + str);

                } catch (Exception e) {

                    System.out.println("S: Error");

                    e.printStackTrace();

                } finally {

                    client.close();

                    System.out.println("S: Done.");

                }

            }

        } catch (Exception e) {

            System.out.println("S: Error");

            e.printStackTrace();

        }

    }

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Thread desktopServerThread = new Thread(new TCPServer());

        desktopServerThread.start();

    }

}



안드로이드폰 소켓통신 코드 ( 아래 )
더보기
package socket.client;

public class NewClient extends Activity {
    private String html = "";
    private Handler mHandler; 
    private Socket socket; 
    private String name; 
    private BufferedReader networkReader; 
    private BufferedWriter networkWriter; 
    private String ip = "xxx.xxx.xxx.xxx"; // IP 
    private int port = 9999; // PORT번호 
    @Override 
    protected void onStop() { 
        // TODO Auto-generated method stub 
        super.onStop(); 
        try { 
            socket.close(); 
        } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        mHandler = new Handler(); 
        try { 
            setSocket(ip, port); 
        } catch (IOException e1) { 
            // TODO Auto-generated catch block 
            e1.printStackTrace(); 
        } 
        checkUpdate.start(); 
        final EditText et = (EditText) findViewById(R.id.EditText01); 
        Button btn = (Button) findViewById(R.id.Button01); 
        final TextView tv = (TextView) findViewById(R.id.TextView01); 
        btn.setOnClickListener(new OnClickListener() { 
            public void onClick(View v) { 
                if (et.getText().toString() != null 
                        || !et.getText().toString().equals(""))
                { 
                    PrintWriter out = new PrintWriter(networkWriter, true); 
                    String return_msg = et.getText().toString(); 
                    out.println(return_msg); 
                }

            }
        });
    }


    private Thread checkUpdate = new Thread() {
        public void run() {
            try {
                String line;
                Log.w("ChattingStart", "Start Thread");
                while (true) {


                    Log.w("Chatting is running", "chatting is running");
                    line = networkReader.readLine();
                    html = line;
                    mHandler.post(showUpdate);
                }


            } catch (Exception e) {
            }
        }
    };


    private Runnable showUpdate = new Runnable() {
        public void run() {
            Toast.makeText(NewClient.this, "Coming word: " + html,
                    Toast.LENGTH_SHORT).show();
        }
    };


    public void setSocket(String ip, int port) throws IOException {
        try {
            socket = new Socket(ip, port);
            networkWriter =
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            networkReader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
        } catch (IOException e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

AIDL : Android Interface Definition Language

  •  서비스와 애플리케이션 콤포넌트간에 프로세스 간의 통신(IPC)을 지원하기 위한 안드로이드 인터페이스 정의 언어이다.
  •  이것은 Remote Call Procedure(RPC)로 COM이나 Corba와 비슷하다.

 

커널 상위 프레임워크는 C/C++ 코드로 짜여진 라이브러리를 JNI로 호출하는 Java 코드들로 구성되어 있습니다.

속도 문제 해결과 동시에 Java 개발자들을 포섭하기 위한 전략으로 보여집니다.

그리고 특이하게도 Java VM이 아닌 Dalvik VM이 사용되는데, sun사의 라이선스 우회와 더불어 Java 코드의 최적화를 위해 VM을 직접 만든 것으로 보입니다.

따라서, javax.* 라이브러리 및 RMI 지원이 안됩니다. RPC 메커니즘으로 AIDL이라는 자체 스펙이 제공되는데.. 이것이 정확히 분산환경에서 사용될 수 있는지는 아직 확인 못 해봤습니다.



반응형