티스토리 뷰
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> |
'개발 > 개발 자료' 카테고리의 다른 글
(Android) 메모리 outofmemory 대처방법 (0) | 2015.01.14 |
---|---|
(Android) java.lang.OutOfMemoryError 메모리부족.. (0) | 2015.01.14 |
(Android) 소켓통신 예제 (0) | 2015.01.14 |
(Android) Thread 간단예제 (0) | 2015.01.14 |
(Android) Android Studio 기초 및 설치 (0) | 2015.01.14 |