Android Socket Example
Android 기반에서 서버에 연결하거나 응답을 처리하는 코드는 유저 쓰레드에서 하도록 되어 있다.
아래의 코드는 Socket을 사용하여 서버(ServerSocket)에 접속하고 서버로부터 메시지를 받아서 안드로이드 화면에 나타내는 예이다
서버 측(인터넷 상의 서버 컴퓨터에서 실행되며 안드로이드 기반이 아닌 표준 자바 실행환경에서 실행되는 서버)
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerForAndroid {
public static void main(String[] args) {
// TODO Auto-generated method stub
int port = 1234;
System.out.println("서버 실행....");
try {
System.out.println("클라이언트 대기중.....");
ServerSocket ss = new ServerSocket(port);
while(true)
{
Socket socket = ss.accept();
System.out.println("클라이언트 접속");
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out);
pw.println("This is Server Message");
pw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("서버종료");
e.printStackTrace();
}
}
}
안드로이드 단말기에서 실행되어 위의 서버에 접속하는 클라이언트 측 코드
package com.example.androidtest;
import java.io.*;
import java.net.Socket;
import android.os.*;
import android.util.Log;
import android.view.View;
import android.widget.*;
import android.app.*;
public class MainActivity extends Activity {
TextView tv;
String svrMsg;
// 메인 쓰레드와 자동으로 연결되는 메시지 핸들러
Handler handler = new MainHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView1);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new Thread()
{
public void run()
{
try
{
Socket socket = new Socket("203.233.196.3", 1234);
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
svrMsg = br.readLine();
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
socket.close();
}catch(Exception e)
{
Log.i("소켓정보", "접속해제");
}
}
}.start();
}
});
}
/* 아래의 Handler 클래스는 메인 쓰레드 영역에 선언하고 메인 쓰레드가 인스턴스를
* 생성하므로 메인쓰레드의 메시지 큐에서 메시지를 가져오는 핸들러이다
* 메인 쓰레드 내에서 실행되는 Looper 가 메시지 큐를 감시하다가 메시지가
* 발견되면 Handler 클래스의 handleMessage()를 호출한다.
* 그러므로 handleMessage()는 메인 쓰레드의 일부분으로 실행되므로 이 메소드 내에서
* 화면을 갱신하는 코드를 실행하여 화면을 갱신하는데 문제가 없다
*/
class MainHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i("핸들러 작동", "메시지 도착");
tv.setText(svrMsg);
super.handleMessage(msg);
}
}
}