달력

3

« 2013/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형
728x90
반응형

안드로이드 - Android에서의 TCP/IP 통신


 

 

안드로이드 에뮬레이터와 데스크탑 서버간 TCP/IP통신을 하는 간단한 코드이다.
보통 이런 테스트는 loopback을 이용하면 되지 않을까? 라고 착각하는 사람들이 굉장히 많을 것이다. 
그래서 서버의 주소를 getLocalHost()를 통해 가져오게 되면 완전 삽질이다.
왜냐? 안드로이드 에뮬레이터의 localhost는 안드로이드 에뮬레이터의 네트웍이지 데스크탑의 네트웍이 아니기 때문이다. 따라서 아래의 소스코드는 일단 네트웍이 돌아가는 컴퓨터에서만 작동이 가능하다.

- Android Client의 메인부분

package android.SocketTest;
import android.app.Activity;
import android.os.Bundle;

public class SocketTest extends Activity {

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Thread cThread = new Thread(new TCPClient());
cThread.start();
}
}


- Client의 실제코드
package android.SocketTest;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import android.TCPDesktopServer.TCPDesktopServer;
import android.util.Log;

public class TCPClient implements Runnable {
public void run() {
try {
// 서버의 주소를 로컬호스트라고 127.0.0.1로 하는 삽질은 하지말것 -_-;
InetAddress serverAddr = InetAddress.getByName(TCPDesktopServer.SERVERIP);

Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, 4444);

String message = "Hello from Client";
try {
Log.d("TCP", "C: Sending: '" + message + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);

out.println(message);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");

} catch(Exception e) {
Log.e("TCP", "S: Error", e);
} finally {
socket.close();
}
} catch (Exception e) {
Log.e("TCP", "C: Error", e);
}
}
}

- 데스크탑 서버 코드
package android.TCPDesktopServer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPDesktopServer implements Runnable{
public static final int SERVERPORT = 4444;
public static final String SERVERIP = "192.168.0.16";

public void run() {
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 + "'");
} 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 a[]) {
Thread desktopServerThread = new Thread(new TCPDesktopServer());
desktopServerThread.start();
}
}


 

728x90
반응형
:
Posted by mapagilove
728x90
반응형
안드로이드 - Tcp/ip를 통한 외부 DB데이터 처리

원본소스:http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=7458&MAEULNO=911&no=54224&page=1

 

클라이언트 - 서버 - DB로 처리하는 방식입니다.

 

클라이언트

package com.net1;

import android.app.Activity;

import android.os.Bundle;

import android.view.*;

import android.widget.*;

public class MainApp extends Activity {

ListView lstView;

     

@Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       

        lstView = (ListView)findViewById(R.id.lstView);

    }

   

    public void chulbal(View v){

       //Toast.makeText(this, "시작", 2000).show();

       Connect connect = new Connect();

       connect.connect_server();

      

      if(v.getId() == R.id.btnCall){ //단순 서버 호출

             connect.send("good");      //호출

             String message = connect.read();   //반환값 얻기

             Toast.makeText(this, message, Toast.LENGTH_SHORT).show();

      }else if(v.getId() == R.id.btnSelect){ //DB 자료 요청

             String[] items = connect.selectData();

             ListAdapter adapter = new ArrayAdapter<String>(this,

                        android.R.layout.simple_list_item_1, items);

             lstView.setAdapter(adapter);

       }

      

       connect.connect_close();

    }

}

 

 

Connect.java -----------

package com.net1;

import java.io.*;

import java.net.*;

import java.util.*;

import android.util.*;

public class Connect {

      private Socket socket;

      private BufferedReader in;

      private PrintWriter out;

 

      public void connect_server() {

            try {

                  socket = new Socket("xxx.xxx.xxx.xxx", 8888);

 

                  in = new BufferedReader(new InputStreamReader(socket

                             .getInputStream(), "UTF-8"));

 

                  out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), true);

            } catch (Exception e) {

                  Log.i("disp", "connect_server err : " + e);

            }

      }

 

      public void send(String message) { // 메세지 전송(서버 호출)

            try {

                  out.println(message);

                  out.flush();

            } catch (Exception e) {

                  Log.i("disp", "send err : " + e);

            }

      }

 

      public String read() { // 메세지 수신(서버로부터)

            try {

                  String message = in.readLine();

                  return message;

            } catch (Exception e) {

                  Log.i("disp", "read err : " + e);

                  return "read err:" + e.getMessage();

            }

      }

 

      public void connect_close() {

            try {

                  in.close();

                  out.close();

                  socket.close();

            } catch (Exception e) {

            }

      }

 

      public String[] selectData() { // DB 자료 반환

            String[] items = null;

            try {

                  out.println("selectData"); // 서버에 DB 자료 요청

                  String result = in.readLine();

 

                  if (!result.equals("select_err")) {

                      StringTokenizer st = new StringTokenizer(result, "$");

                      Log.i("disp", "ssssss : " + st.countTokens());

                      items = new String[st.countTokens()];

                      for (int i = 0; i < items.length; i++) {

                          items[i] = st.nextToken();

                      }

                  }

            } catch (Exception e) {

                  Log.i("disp", "selectData err : " + e);

            }

            return items;

      }

}

 

selectData 는 서버에서 명령문으로 받아 특정 테이블에 데이터를 넘겨받는 방식으로

구성되어 있습니다.

sql문장 전체를 넘겨 서버에서 리턴값만 받는 방식으로 하셔도 됩니다.

 

테스트라 간단하게 구성하였습니다.

 

아래는 서버의 일부 반환 소스입니다.

      public void process(){  //db 자료 처리  클라이언트로 전달

            ArrayList<String> list = new ArrayList<String>();

            DbConnect dbConnect = new DbConnect();

            list = dbConnect.selectData();

           

            if(list.isEmpty()){

                  send("select_err");

            }else{

                  String data = "";

                  for(String s : list){

                        data += s + "$";                   }

                  send(data);

            }

      }

 

      public ArrayList<String> selectData(){

            ArrayList<String> list = new ArrayList<String>();

            String sql = "select a, b, c from test";

           

            try {

                  pstmt = conn.prepareStatement(sql);

                  rs = pstmt.executeQuery();

                 

                  while(rs.next()){

                        String data = rs.getString(1) + " " +

                             rs.getString(2) + " " + rs.getString(3);

                        list.add(data);

                  }

            } catch (Exception e) {

                  System.out.println("selectData 오류 : " + e);

            } finally{

                  try {

                        if(rs !=null) rs.close();

                        if(pstmt !=null) pstmt.close();

                  } catch (Exception e2) {}

            }

           

            return list;

      }

728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 - 자기 IP주소 가져오기

원본 출처 :http://eduinfo.pe.kr/bbs/board.php?bo_table=01_6&wr_id=2549

   public String getLocalIpAddress() {
      try {
              Enumeration<NetworkInterface> en =  NetworkInterface.getNetworkInterfaces();
              while(en.hasMoreElements()) {
                     NetworkInterface interf = en.nextElement();
                     Enumeration<InetAddress> ips = interf.getInetAddresses();
                          while (ips.hasMoreElements()) {
                            InetAddress inetAddress = ips.nextElement();
                            if (!inetAddress.isLoopbackAddress()) {
                                    return inetAddress.getHostAddress().toString();
                         }
                  }
              }
      } catch (SocketException ex) {
              Log.e("Error", ex.toString());
      }
          return null;
    }
728x90
반응형
:
Posted by mapagilove
728x90
반응형

열공 안드로이드 - 안드로이드에서 db(sqlite) 쉽게 보기 

원본 출처: [블로그 링크] http://onjo.tistory.com/2052



안드로이드에서 db(sqlite) 정보를 
쉽게 보는 방법을 정리해 보았습니다.

(초보자를 위한 팁 이라고 생각합니다.)



핵심만 정리하면 아래와 같습니다.

(1) db 내보내기 (db export / data.sqlite)
=> 이클립스 혹은 Droid Explorer 이용


(2) db 보기
=> firefox 확장 도구인 SQLite Manager를 이용하여
    (1) 에서 추출한 db(data.sqlite)를 열면 됩니다.

    * mysql에서 mysqlyog를 사용하는 것과 비슷한 개념

================================================

안드로이드에서 db(sqlite) 쉽게 보기


1. Run Eclipse (이클립스 실행)


2. Select Project (프로젝트 선택) 
   -> Run Android Emulator (안드로이드 에뮬레이터 실행)


3. Select "DDMS perspective" (DDMS 선택)
   -> File Explorer
   -> data - data - package name (패키지명)
      - databases - data 선택




4. select "pull a file from the device" (pull 선택)
   -> save the "data.sqlite" (db export / db 내보내기)


======================================================

5. View DB (DB 내용 보기)
  1) Firefox :: SQLite Manager
     http://code.google.com/p/sqlite-manager/

      => firefox browser, click the *.xpi (firefox에서 xpi 클릭하면 설치됨)
  

  2) click the "Connect Database" (DB 연결 버튼 클릭)


======================================================
※ Eclipse the not view "File Explorer"
(이클립스에서 File Explorer가 내용이 안보일 경우)

=> Droid Explorer 이용해 db export
- Droid Explorer : http://de.codeplex.com/



6. Conclusion (정리)
  1) db export (db 내보내기)
     - eclipse DDMS 혹은 Droid Explorer

  2) view db (db 보기)
    - firefox SQLite Manager
728x90
반응형
:
Posted by mapagilove
728x90
반응형

블로그만들기 - 구글애드센스 웨스턴유니온 신청방법 환전하기

원본출처:http://www.blogdalin.com/m/post/view/id/4 

설치형 블로그를 운영하는 블로거라면 구글애드센스를 통해서 수익을 낼 수 있다. 나 역시 이렇게 블로그를 다시 시작하면서 구글애드센스를 달았고, 오래전 받은 수익을 보류 끝에 얼마전 웨스턴유니온을 통해 수익을 지급 받았다. 

구글수표를 받은 다음달부터 구글에서 웨스턴유니온 서비스를 시작했기 때문에, 수표만 받았지 한번도 수표로 환전한적은 없다. 

수표로 환전할때는 수수료도 들고, 추심전매입을 거부당하면 시간또한 오래걸리기 때문에 구글애드센스 수익이 월 $7000불이 넘지 않는다면 웨스턴유니온 지급방식을 추천한다.


추심전매입만 확실히 해준다면 난 지금도 수표로 받고싶은 마음이 굴뚝같다. 10만원짜리 수표만 만져본 사람이라 이런수표를 받으면 왠지 백지수표를 받은 느낌이다.



종이 질도 매우 좋다. 행여 구겨질까 아무도 읽지않는 맨투맨책에 넣어뒀다. 
구글애드센스의 수익을 웨스턴유니온으로 받을려면 다음과 같이 하면된다.


구)인터페이스 기준 : 내계정탭을 선택후 지급 세부사항[수정]을 클릭한다.



지급형식선택 페이지가 뜰것이다. 웨스턴유니온을 선택후 계속을 클릭한다.



수취인 이름과 성을 적고, 정부 발행ID가 있음에 동의한다음 저장버튼을 누른다. 월 $100불이 넘었는다면 매달27-30일 사이에 지급개시된다. 

지급내역은 구)인터페이스 기준으로 내계정 -> 지급내역을 통해 알 수 있다.



지급개시가 뜨고 세부정부를 보면 이렇게 MTCN번호를 알려주는데, 정확히 메모한후 신분증을 들고 기업은행으로 향하자. 번호표를 뽑고 대기한후 차례가 오면 직원에게 당당히 말한다.

"저.. 웨스턴유니온 송금한거 받으러 왔는되요..." 

"받으러요?" 

"네 . 받으러 왔어요.." 

그럼 아래와 같은 기업은행-웨스턴유니온 빠른송금 신청서를 줄것이다. 영문으로 작성해야 되는줄 알고, 영문주소를 외워갔더니 한글로 적어도 된다고 한다.



신분증과 함께 신청서를 내밀면 2분정도후 돈다발을 줄것이다.



가까운곳에 기업은행이 없어 한시간정도 차를 타고 가야하기때문에 이것도 일이다. 돈받는 일이라 좋긴 하지만, 국민은행이나 농협에서도 취급해줬으면 하는 바램이다.

 

728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 - 특정 앱 설치 여부 확인 및 마켓 이동 소스

원본출처: http://blog.daum.net/satapon/111

 

- 어플목록(정확히는 패키지들) 출력하는 소스 

ArrayList<String> apps = new ArrayList<String>();
       List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); 
        
       for(int j = 0 ; j < packs.size(); j++){
       apps.add(packs.get(j).packageName);
       }
       for(int j = 0 ; j < apps.size(); j++){

           Log.i("test",apps.get(j));    
       }

 

-  설치여부 확인후 없으면 마켓으로 이동하는 소스

http://baeksupervisor.tistory.com/120

 

- 안드로이드에서 마켓 링크 따기

http://jely.egloos.com/4433500

 

- 응용한 마켓 다운로드 여부 확인하는 다이얼 로그 함수

//pdf지원 어플리케이션의 마켓검색을 묻고, 종료하는 다이얼로그 호출
    public void viewPdfInstallDialog()
    {
     String alertTitle = getResources().getString(R.string.app_name);
  String buttonMessage = "현재 pdf문서를 지원하는 프로그램이 없습니다. 마켓에서 검색하시겠습니까?";//getResources().getString(R.string.alert_msg_exit);
  String buttonYes = "네";//getResources().getString(R.string.button_yes);
  String buttonNo = "아니오";//getResources().getString(R.string.button_no);
     
  new AlertDialog.Builder(LoadPDFActivity.this)
  .setTitle(alertTitle)
  .setMessage(buttonMessage)
  .setPositiveButton(buttonYes, new DialogInterface.OnClickListener() 
  {
 
   public void onClick(DialogInterface dialog, int which) 
   {
       //검색
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pdf"));
    startActivityForResult(intent, 0);
   }
  })
  .setNegativeButton(buttonNo, new DialogInterface.OnClickListener() 
  {
 
   public void onClick(DialogInterface dialog, int which) 
   {
       //종료
    finish();
   }
  })
  .show();
    }

728x90
반응형
:
Posted by mapagilove
반응형