검색결과 리스트
글
안드로이드 - Java 서버간 Object 객체 소켓 프로그래밍
안드로이드/애플리케이션 제작
2015. 10. 29. 13:24
Java를 기반으로 한 프로그래밍을 하다 보면 자신이 만든 Class 단위의 값을 전송하고 싶은 경우가 있습니다. 만약 서버가 C/C++ 기반으로 만들어진 경우 호환을 위해 Class 내의 값을 기본형인 int나 String으로 변환한 후 이를 Byte 값으로 변환하여 전송을 한 후 이 값을 받은 서버가 다시 C/C++에서 가공하기 편한 구조로 다시 변경하는 방식을 사용해야 되어서 프로그래밍을 할 때 다소 불편한 점이 있습니다.
만약 서버가 Java를 기반으로 한다면 프로그래밍의 방식이 약간은 쉽게 바꿀 수 있습니다. 안드로이드와 서버 모두 Java를 사용하므로 Class를 통째로 넘겨주어도 이를 그대로 사용할 수 있다는 것입니다. 이 기능을 구현해주는 것이 바로 이번 포스팅에서 다루게 될 ObjectInputStream과 ObjectOutputStream 입니다. 바로 예제를 통해 이를 수행해보도록 합니다.
먼저 Java 언어로 서버를 설계해보도록 합니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { // TODO Auto-generated method stub try { int port = 8200; //서버에 사용할 포트 번호를 설정해줍니다. ServerSocket sock = new ServerSocket(port); //안드로이드 Client로부터 접속을 받을 준비를 합니다. Socket socket = sock.accept(); //Socket로부터 받게 되는 InputStream을 설정합니다. InputStream is = socket.getInputStream(); //InputStream의 최종 형식을 Object로 설정해줍니다. ObjectInputStream ois = new ObjectInputStream(is); //Socket로부터 받은 데이터를 Object로 수신합니다. String getString = (String)ois.readObject(); System.out.println("receive : " + getString); ois.close(); is.close(); socket.close(); sock.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } | cs |
다음으로 안드로이드에서 Java 서버로 Object를 전송할 수 있는 프로그램을 만들어봅니다.
activity_main.xml
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activitymain" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="90dp" android:layout_height="wrap_content" android:text="IP주소" /> <EditText android:id="@+id/ipaddr" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="192.168.1.1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="90dp" android:layout_height="wrap_content" android:text="PORT 번호" /> <EditText android:id="@+id/portnumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="8200" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="90dp" android:layout_height="wrap_content" android:text="보낼 내용" /> <EditText android:id="@+id/sendserv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="시스템프로그램설계" /> </LinearLayout> <Button android:id="@+id/tryconnect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="connect!" android:onClick="OnClick" /> </LinearLayout> | cs |
MainActivity.java
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity{ private Handler mHandler = new Handler(); private EditText ipaddr, portno, message; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ipaddr = (EditText)findViewById(R.id.ipaddr); portno = (EditText)findViewById(R.id.portnumber); message = (EditText)findViewById(R.id.sendserv); } public void OnClick(View v) throws Exception{ switch(v.getId()){ case R.id.tryconnect: (new Connect()).start(); break; } } class Connect extends Thread { public void run() { String ip = ipaddr.getText().toString(); int port = Integer.parseInt(portno.getText().toString()); String output = message.getText().toString(); try { //서버에 접속합니다. Socket socket = new Socket(ip, port); //소켓으로부터 OutputStream을 설정합니다. OutputStream os = socket.getOutputStream(); //OutputStream을 Object 방식으로 전송하도록 설정합니다. ObjectOutputStream oos = new ObjectOutputStream(os); //Object를 Socket을 통해 값을 전송합니다. oos.writeObject(output); oos.close(); os.close(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block final String recvInput = "연결에 실패하였습니다."; mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub setToast(recvInput); } }); } } } void setToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } } | cs |
결과는 아래와 같습니다.
Client(안드로이드)측
Server측
300x250
'안드로이드 > 애플리케이션 제작' 카테고리의 다른 글
Fedora에서 Android Studio가 동작되지 않을 때[Unable to run mksdcard SDK tool] (0) | 2015.12.21 |
---|---|
Android Studio로 improt 한 후 컴파일 타겟 변경하기(failed to find target with hash string ...) (0) | 2015.11.06 |
Linux(우분투)에서 Android Studio 빠르게 실행하는 방법(바로가기 추가하기) (0) | 2015.10.17 |
같은 공유기에 접속중인 안드로이드 기기 탐색 및 통신하기 (0) | 2015.10.16 |
Error: The SDK Build Tools revision is too low for project (0) | 2015.10.10 |