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


- Android Client의 메인부분
01.package android.SocketTest;
02.import android.app.Activity;
03.import android.os.Bundle;
04.  
05.public class SocketTest extends Activity {
06.  
07.    @Override
08.    public void onCreate(Bundle icicle) {
09.        super.onCreate(icicle);
10.        setContentView(R.layout.main);
11.        Thread cThread = new Thread(new TCPClient());
12.        cThread.start();
13.    }
14.}



- Client의 실제코드

01.package android.SocketTest;
02.  
03.import java.io.BufferedWriter;
04.import java.io.OutputStreamWriter;
05.import java.io.PrintWriter;
06.import java.net.InetAddress;
07.import java.net.Socket;
08.  
09.import android.TCPDesktopServer.TCPDesktopServer;
10.import android.util.Log;
11.  
12.public class TCPClient implements Runnable {
13.    public void run() {
14.         try {
15.             // 서버의 주소를 로컬호스트라고 127.0.0.1로 하는 삽질은 하지말것 -_-;
16.             InetAddress serverAddr = InetAddress.getByName(TCPDesktopServer.SERVERIP);
17.       
18.             Log.d("TCP", "C: Connecting...");
19.             Socket socket = new Socket(serverAddr, 4444);
20.               
21.             String message = "Hello from Client";
22.             try {
23.                 Log.d("TCP", "C: Sending: '" + message + "'");
24.                 PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
25.                   
26.                 out.println(message);
27.                 Log.d("TCP", "C: Sent.");
28.                 Log.d("TCP", "C: Done.");
29.                   
30.             } catch(Exception e) {
31.                 Log.e("TCP", "S: Error", e);
32.              } finally {
33.                socket.close();
34.              }
35.         } catch (Exception e) {
36.              Log.e("TCP", "C: Error", e);
37.         }
38.    }
39.}



- 데스크탑 서버 코드
01.package android.TCPDesktopServer;
02.import java.io.BufferedReader;
03.import java.io.InputStreamReader;
04.import java.net.ServerSocket;
05.import java.net.Socket;
06.  
07.public class TCPDesktopServer implements Runnable{
08.    public static final int SERVERPORT = 4444;
09.    public static final String SERVERIP = "192.168.0.16";
10.      
11.    public void run() {
12.        try {
13.            System.out.println("S: Connecting...");
14.            ServerSocket serverSocket = new ServerSocket(SERVERPORT);
15.  
16.            while (true) {
17.                Socket client = serverSocket.accept();
18.                System.out.println("S: Receiving...");
19.  
20.                try {
21.                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
22.                    String str = in.readLine();
23.                    System.out.println("S: Received: '" + str + "'");
24.                } catch(Exception e) {
25.                    System.out.println("S: Error");
26.                    e.printStackTrace();
27.                } finally {
28.                    client.close();
29.                    System.out.println("S: Done.");
30.                }
31.            }
32.  
33.        } catch (Exception e) {
34.            System.out.println("S: Error");
35.            e.printStackTrace();
36.        }
37.    }
38.  
39.    public static void main (String a[]) {
40.        Thread desktopServerThread = new Thread(new TCPDesktopServer());
41.        desktopServerThread.start();
42.    }
43.}
Posted by 1010