안드로이드에서 Socket을 이용하여 인터넷 상의 서버(ServerSocket)에 접속하는 예

안드로이드에서 5초에 한번씩 서버에 요청하여 서버의 시간을 받고 안드로이드 화면에 출력하는 내용

ServerForAndroid.java (서버 컴퓨터에서 실행되는 자바 애플리케이션)

package com.example.socket.server; import java.io.*; import java.net.*; import java.util.*; public class ServerForAndroid { public static void main(String[] args) { ServerSocket serverSocket = null; int serverPort = 1234; try { serverSocket = new ServerSocket(serverPort); while(true) { System.out.println("접속대기 중......"); Socket socket = serverSocket.accept(); ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream objInput = new ObjectInputStream(socket.getInputStream()); Object input = objInput.readObject(); System.out.println("접속확인됨"); String response = ((String)input) +":"+ new Date(); objOut.writeObject(response); objOut.flush(); } } catch (Exception e) { e.printStackTrace(); } } }


res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /> </LinearLayout>


MainActivity.java

package com.example.androidapp; import java.io.*; import java.net.*; import android.app.*; import android.content.*; import android.graphics.*; import android.os.*; import android.util.*; import android.view.*; import android.view.*; import android.view.View.*; import android.widget.*; public class MainActivity extends Activity { TextView tv; Handler handler = new Handler(); String response; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1);

// 아래의 코드처럼 안드로이드에서 네트워크를 연결하고 요청/응답을 처리하기 위해서는

// 메인 쓰레드가 아닌 유저 쓰레드를 사용해야 한다 new Thread() { public void run() { while(true) { connect(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } private void connect() { Socket socket = null; try{ socket = new Socket("211.183.3.200", 1234); ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); objOut.writeObject("time"); objOut.flush(); ObjectInputStream objInput = new ObjectInputStream(socket.getInputStream()); response = (String)objInput.readObject(); handler.post(new Runnable() { public void run() { tv.setText(response); } }); }catch(Exception ex) { Log.e("소켓접속오류", ex.getMessage()); } } }

위의 예에서 Thread를 이용한 이유는 지속적으로 5초마다 요청이 이루어져야 하므로 무한 루프가 필요한데, onCreate()안에서 무한 루프를 실행하면 onCreate()가 끝나지 않으므로 뒤이어 실행되어야 하는 화면 출력 기능은 실행될 수 없는 상태가 된다.

onCreate()가 신속히 종료되고 뒤이어 화면에 내용이 출력되도록 하려면 onCreate()안에 들어가야 할 무한 루프를 Thread안에서 동작하도록 하면 된다. 또 주의할 점은 개발자 정의 쓰레드 안에서는 직접적으로 UI를 갱신할 수 없으므로 Handler를 경유해서 UI 쓰레드에게 화면 갱신을 의뢰하면 될 것이다.


Posted by cwisky