'안드로이드 아파치 서버 & 클라이언트 Socket 통신에 대한 기초적 방법'에 해당되는 글 1건

  1. 2010.07.30 안드로이드 아파치 서버 & 클라이언트 Socket 통신에 대한 기초적 방법 1
04.Anddoid2010. 7. 30. 15:30
반응형

서버와 클라이언트의 소켓(Soket) 통신에 대해 알아보도록 합시다.

이것인 기존의 JAVA 통신에 대한 방법만 잘 알고있다면 무난히 가능한 부분입니다.

실제로 서버는 안드로이드를 통해서 돌리는 것이 아닌, 기존의 자바 프로그래밍을 이용하게됩니다.

물론 클라이언트는 안드로이브 영역이기때문에 안드로이드로 개발을 해야합니다.

*이 방법은 아파치 서버를 이용한 방법입니다.

아래는 Server 및 Client에 가장 우선적으로 필요한 api입니다.

//아래는 Server 부분

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket

import java.net.Socket;

//아래는 Client 부분

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.URL;

import java.net.URLConnection;



 현재 보이는 임포트문에서 java.net에 해당하는 부분이 실제 접속이 가능하게 해주는 api입니다. 위의 java.io는 데이터 전송하는 부분에 있어서 필요한 핵심입니다.

아래 보이는것 은 닷컴 레퍼런스에서 발췌한 소스입니다.


TCP SERVER 부분입니다.

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket; 


public class TCPServer implements Runnable {

    public static final int ServerPort = 9999; //소켓포트설정

    public static final String ServerIP = "xxx.xxx.xxx.xxxx"; //연결될 서버IP


    @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();

    }

}



설명:

1. 자신의 port를 설정해서 socket을 엽니다.

2. 클라이언트에서 오는 정보를 받기 위해 accept()를 통해서 대기합니다.

3. 데이터가 왔다는 것이 감지되면 Reader를 통해 Stream정보를 읽어냅니다.

3. 받은 Stream정보를 다시 클라이언트로 돌려보냅니다.

위의 소스는 하나의 Client와 Connent를 통해 데이터를 주고 받는 형태입니다.



다음 보게 될 것은 닷컴레퍼런스에서 발췌한

이제 볼 부분은 안드로이드 TCP Client 부분입니다.

다음부분이 필수적으로 import가 되어있어야합니다.


package socket.client;


import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.URL;

import java.net.URLConnection;


import org.apache.http.util.ByteArrayBuffer;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;


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"; // SERVER 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();

        }

    }

}


설명:

1. onCreate()로 되면 서버에 연결하도록 합니다.

2. textbox에 문자를 넣고 버튼을 누르면 서버로 데이터를 전송합니다.

3. 서버에 오는 데이터를 받기위해 while을 합니다.

4.받은 정보를 Toast를 이용해 표시합니다.


다음은 이어서

XML 소스입니다.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" >

    <TextView android:id="@+id/TextView01"

    android:layout_height="wrap_content"

    android:layout_width="fill_parent"/>

    <EditText android:id="@+id/EditText01"

    android:layout_height="wrap_content"

    android:layout_width="fill_parent"/>

    <Button android:id="@+id/Button01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Send"/>

    <TextView android:id="@+id/chatting"

    android:layout_height="wrap_content"

    android:layout_width="fill_parent"/>   

</LinearLayout>



설명 :

간단하게 EditText를 이용해서 거기에 들어간 문자열을 버튼을 통해 서버로 전송시키는 기능이 구현되어있습니다.


다음은 이어서

AndroidManifest.xml 소스입니다.

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="socket.client"

  android:versionCode="1"

  android:versionName="1.0">

  <application android:icon="@drawable/icon" android:label="@string/app_name">

      <activity android:name=".NewClient"

        android:label="@string/app_name">

    <intent-filter>

      <action android:name="android.intent.action.MAIN" />

      <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>

  </activity>

  </application>

  <uses-permission android:name="android.permission.INTERNET" /> //필수 선언

</manifest>


설명:

가장 핵심이 되는 부분은

정리를 해보면 인터넷을 사용하기 위해서 다음이 꼭 추가되어야 한다는 사실입니다.


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


이렇게 하면 기본적인 통신이 가능하게 됩니다. 물론 테스트를 할려면 완성된 서버와 통신하기위한 안드로이드 에뮬레이터및 안드로이드 OS가 탑제된 폰이 필요합니다.

실제 구동여부는 서버의 미완성으로 확인을 못했지만 교과서 적으로 쓰이는 방법이기 때문에 소스를 분석하고 정리해서 올려봅니다. 많은 도움이 되었으면 좋겠습니다.


출처 : http://arkroid.tistory.com/34

Posted by 1010