스마트폰앱

오늘:
2,539
어제:
2,589
전체:
2,707,438

고객센타 : 070-7752-2000
팩스 : 070-7752-2001
휴대폰 : 010-9513-0019
email : voipkorea@yahoo.co.kr

국민은행
(주)제이에스솔루션
047101-04-155519

Flag Counter
■ 무료 : 유선 집전화 휴대폰 ( 한국 미국 중국 카나다) ↔ (국내 해외 여행자 상사 주재원 유학생) / 가입무 무제한무료■

http://pulsebeat.tistory.com/24

 

<목표> [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기

     

   

   오늘은  서버, 클라이언트의 소켓(Soket) 통신에 대해서 알아보겠습니다. 기존의 많은 안드로이드 어플리케이션이 각각의 서버를 이용하여 정보를 주고 받습니다. 아무래도 기기 내에서 만으로 서비스하기에는 한계가 있기 때문이죠. 정보를 저장하고, 서버에서 처리하여 결과를 주고, 클라이언트는 그 결과를 받아서 어플리케이션에 알맞은 동작을 취하도록 합니다. 트위터 서비스나 스마트폰을 이용해서 공짜 문자(통신료 제외)를 주고 받을 수 있는 것도 서비스를 제공하는 곳에서 서버를 두기 때문입니다. 그 덕분에 핸드폰을 벗어나 더 많은 정보를 처리할 수 있도록 할 수 있습니다.

 

   서버/클라이언트 소켓 통신은 기존의 자바를 이용해서 소켓 통신을 해보신 분들이라면 어렵지 않게 사용하실 수 있습니다. 서버의 소스 자체는 완전히 자바 소스로 이루어지기 때문이지요. 실제로 서버는 안드로이드를 통해서 돌리는 것이 아니라, 기존의 자바 프로그래밍을 이용하여 수행합니다. 클라이언트는 당연히 안드로이드로 개발을 해야겠지요. 오늘 보여드릴 예제 소스는 인터넷에 돌아다니는 간단한 서버 – 클라이언트 소켓 통신을 가지고 와서 나름대로 수정을 해본 것입니다. 기존의 샘플 코드가 하나의 메시지를 서버로 보내고 난 뒤에, 바로 클라이언트에서 기다리면서 데이터가 오기를 기다리는 형태로 제공되었습니다. 그렇기 때문에 클라이언트가 계속 데이터를 기다리면서 블록킹 되어 있는 상태에서만 프로그래밍이 돌아갔습니다. 이러한 부분을 수정하여 쓰레드를 이용하여 백그라운드에서 돌아가게 하여, 기존의 클라이언트에서는 원래의 프로그램이 수행되고, 서버에서 오는 정보를 받는 부분은 쓰레드를 통해 해결했습니다.

 

    먼저 서버를 만들 자바 코드를 알아보고, 뒤에는 안드로이드에서 소켓 통신을 위한 설정과정을 간단한 예제를 통해서 알아보겠습니다.

     

     

     

STEP 1  Java Source Code

     

   자바 코드는 두 가지를 다루게 됩니다. 처음은 서버를 돌리는 데 필요한 자버 코드를 알아보고, 두 번째는 안드로이드 클라이언트 코드를 알아보겠습니다.

 

 

  [[ 서버 ]]   TCP Server Java Code

 

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";

 

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

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

    }

}

 

    서버의 기능은 클라이언트에서 오는 데이터를 받아들이는 게 핵심입니다. 자신의 포트를 세팅하여 소켓을 여는 것부터 시작하여, 클라이언트에서 오는 정보를 받기 위해서 accept() 를 통해서 기다립니다. 그리고 데이터가 왔다는 신호가 오면 리더를 통해서 스트림을 읽어냅니다. 그리고 자신이 받은 스트림 정보를 다시 돌려보내는 역할을 합니다. 현재는 하나의 클라이언트와 컨넥트를 통해 데이터를 주고 받는 형식입니다. 많은 클라이언트와 통신하고 싶으면 클라이언트에 대한 정보를 저장하고, 여러 클라이언트에게 적절하게 보내는 기능을 추가하시면 되겠습니다.

 

 

   [[ 클라이언트 ]]   TCP Client Java Code

 

 

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

        }

    }

}

 

 

   이 번에 살펴볼 코드는 안드로이드 클라이언트 프로그램입니다. 안드로이드 클라이언트 코드에서는 서버에 소켓을 연결하고 받은 정보를 이용하여 프로그램을 수행시키는 것을 다룹니다. 먼저 onCreate()가 되면 서버에 연결하도록 설계되어 있습니다. IP 주소와 포트 번호를 알맞게 설정해주시고, 소켓을 연결합니다. 그리고 데이터를 주고 받기 위해서 리드, 라이터를 설정하여 둡니다. 예제에서는 간단히 텍스트 박스에 문자를 적고 버튼을 누르면, 서버로 데이터를 보냅니다. 그리고 서버에서 오는 데이터를 계속 받기 위해서 while을 쓰레드를 통해서 실행합니다. 여기서 받은 데이터 정보를 토스트 기능을 통해 출력합니다. 여기서 UI에 대한 접근을 핸들러를 통해서 하고 있는 것을 확인할 수 있습니다. 이렇게 하는 이유는 다른 포스트에 올리겠습니다. 일단 UI에 대한 접근은 핸들러를 통해서 수행한다고 생각하시고 프로그램을 수행해야한다는 것만 기억하시고 계시면 될 것 같습니다.

       

 

STEP 2  Xml Code

       

    Xml 코드에는 간단히 EditText에서 넣은 문자열을 버튼을 통해 서버로 데이터를 보내는 기본적인 기능만 추가하시면 됩니다.

 

<?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>

 

        

     

STEP 3  AndroidManifest.xml Code

     

    메니페스트에는 소켓을 이용하기위해 인터넷을 사용해야 하므로, 인터넷을 사용하겠다는 퍼미션만 추가해주시면 됩니다.

       

AndroidManifest.xml 에 추가해야할 인터넷 사용 허가권

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

 

<?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>

     

     

     

 < 마무리 >   서버/클라이언트 소켓(Socket) 통신하기

     

 

   서버와 클라이언트의 소켓 통신에 대해서 알아보았습니다. 핸드폰 내에서의 기능과 정보만으로는 어플리케이션이 한정적일 수 밖에 없습니다. 그렇기 때문에 통신을 통해서 좀 더 폭넓은 서비스를 제공하기 위해서 서버와 클라이언트가 서로 통신할 수 있도록 소켓에 대해서 알아볼 필요가 있었습니다. 하나의 서버가 여러 곳의 클라이언트들에 대해서 서비스를 해줘야 할 때는 클라이언트에 대한 정보를 가지고 있으면서 소켓을 각각 연결시켜주어야 합니다. 안드로이드 클라이언트 부분에서도 현재 수행되고 있는 동작에 영향을 받지 않으면서 백그라운드에서 쓰레드가 돌면서 서버에서 오는 정보를 수시로 받을 수 있도록 해야합니다. 소켓 통신에 대한 기존 개념을 알고 계신 분들이라면 크게 어렵지 않게 이해하실 수 있으셨으리라 봅니다. 처음 접하시는 분들은 데이터를 주고 받는 부분에서 자신이 수행하고 싶은 기능만 추가해주시면 간단히 소켓 통신을 하실 수 있으리라 생각합니다.

   

조회 수 :
20343
등록일 :
2012.09.20
12:58:15 (*.160.42.233)
엮인글 :
http://webs.co.kr/index.php?document_srl=10671&act=trackback&key=98e
게시글 주소 :
http://webs.co.kr/index.php?document_srl=10671
List of Articles
번호 제목 글쓴이 날짜 조회 수
64 Sqlite detail easy tutorial. admin 2017-09-09 125
63 Change package name Linphone Android admin 2017-08-25 279
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 271
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 272
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 261
59 sipdroid source code admin 2017-08-08 340
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 5561
57 the sipdroid Research Miscellaneous admin 2015-03-26 2727
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 3982
55 Softphones admin 2014-09-20 4435
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 4845
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 4791
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 5602
51 speex support in android admin 2014-03-19 5821
50 voxmobile Source and how to build admin 2014-02-18 6187
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 6636
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 18050
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 6589
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 32011
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 7659
44 Android DialogFragment Tutorial admin 2014-02-09 6884
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 9298
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 8228
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 7578
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 13913
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 6904
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 9262
37 How to create a custom title bar admin 2013-07-15 9516
36 Rotary Dialer clip art admin 2013-04-20 17142
35 Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 10165
34 java network programming source code, learning socket programming admin 2012-12-04 10292
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 12063
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 16386
31 통신사별 와이파이 비밀번호 admin 2012-10-31 14349
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 10648
29 Android User Session Management using Shared Preferences admin 2012-10-16 31968
28 Unicode Tables v4 admin 2012-10-16 22930
27 HTML Codes admin 2012-10-16 9622
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 11787
25 ASCII Table and Description admin 2012-10-16 11093
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 22076
23 How to read contacts on Android 2.0 admin 2012-10-14 13125
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 15050
21 Android Detect Internet Connection Status admin 2012-10-12 20593
20 JAVA + SSL (server and client examples) admin 2012-10-07 22147
19 Querying The Android Contact Database admin 2012-09-30 10505
18 Manage Contacts android admin 2012-09-30 12463
17 Android Contacts API 2 example admin 2012-09-30 13559
16 Android 2.0 주소록 동기화 기능 admin 2012-09-30 38695
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 14536
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 11201
13 [안드로이드/개발] Intent admin 2012-09-23 17519
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 28173
11 google voice source code admin 2012-09-22 10488
» [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 20343
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 11582
8 Android SQlite 사용 admin 2012-09-04 11086
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 41736
6 전화관련 안드로이드함수 admin 2012-08-18 15109
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 15663
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 11000
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 12971
2 App Store - ILD Dialer admin 2012-06-17 9539
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 9918