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