[Android] Android Socket Communication

Updated:

Server

Android Studio 말고 Eclipse에서 서버 만들고 실행

class EchoServerTh extends Thread {

  private Socket socket;

	public EchoServerTh(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			InputStream is = socket.getInputStream();
			InputStreamReader ir = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(ir);
			PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
			while (true) {
				String str = br.readLine();// 클라이언트가 보낸 메시지 한줄 읽음
				System.out.println("클라이언트 메시지:" + str);
				out.println(str + "\n");// 클라이언트가 보낸 메시지를 다시 클라이언트에게 보냄
				if (str.startsWith("/stop")) {
					break;
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public class EchoServer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			ServerSocket ss = new ServerSocket(포트번호(EX.3333));// 서버소켓오픈. 파라메터는 포트번호
			System.out.println("서버시작");
			while (true) {
        // 클라이언트 접속 기다리다 요청수락. 수락후 이 클라이언트와 1:1통신할 소켓 반환
				Socket socket = ss.accept();
				System.out.println("클라이언트 접속");
				new EchoServerTh(socket).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Client

안드로이드 앱을 클라이언트로

(1) MyThread 클래스

public class MyThread extends Thread {

    String msg;

    // 생성자, getter, setter

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(서버IP주소); // 서버 IP 객체 생성
            Socket socket = new Socket(serverAddr, 포트번호(서버 쪽에서  것과 동일하게)); // 통신 소켓 객체 생성
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out.write(msg + "\n");
            out.flush();
            msg = "received from:" + in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2) 레이아웃

  • 서버한테 보낼 메시지를 쓸 EditText
  • 전송 Button
private EditText msg; // 메인 액티비티에서

(3) MainActivity

  • 버튼 핸들러
public void onSend(View view) {
    String m = msg.getText().toString();
    MyThread th = new MyThread(m);
    th.start();
}

Leave a comment