안드로이드 개발 질문/답변
(글 수 45,052)
안드로이드에 소켓 서버를 만들어서 컴퓨터의 웹 브라우저에서 접근하여 웹 페이지를 볼 수 있게 하려고 합니다.
아주 간단하게 빈 액티비티에서 스레드를 생성하여 어플을 실행하는 동안 소켓통신을 하는 데에는 성공했습니다.
하지만 액티비티에 토글버튼을 만들어 서버를 시작하고 정지하게 만드는 일은 쉽지가 않네요. 방법이 있을까요?
제가 초보라서 그런지 어떻게 해야할지 감이 잘 오지 않네요. 다음은 제 소스입니다.
HTTPServer.javaHTTPServer.java
package com.example.socketserver; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket; import android.util.Log; public class HTTPServer implements Runnable { public static final int SERVERPORT = 9999; private Thread thisThread; public void start() { thisThread = null; thisThread = new Thread(this); thisThread.start(); } public void stop() { // 멈추는법 } @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(SERVERPORT); Thread sThread = null; while (true) { Socket soc = serverSocket.accept(); sThread = new Thread(new HTTPSession(soc)); sThread.start(); } } catch (IOException e) { Log.i("TCP", "S: new ServerSocket Error", e); } } public class HTTPSession implements Runnable { Socket mSock; public HTTPSession(Socket soc) { mSock = soc; } @Override public void run() { BufferedReader in = null; String str = null; try { in = new BufferedReader(new InputStreamReader( mSock.getInputStream())); do { str = in.readLine(); Log.i("TCP", "S: Received: '" + str + "'"); } while (str.trim().length() > 0); } catch (IOException e) { Log.i("TCP", "Read Error"); e.printStackTrace(); } try { OutputStream out = mSock.getOutputStream(); PrintWriter pw = new PrintWriter(out); pw.print("<html><h1>The server is running.</h1></html>"); pw.flush(); } catch (IOException e) { e.printStackTrace(); } try { mSock.close(); } catch (IOException e) { e.printStackTrace(); } } } }
코드하이라이터를 적용한 스크린샷이네요..
줄이 맞지 않아 속이..ㅠㅠ
안드로이드 디바이스에서 서버를 만들어서 컴퓨터에서 접근하시려는 이유는 핸드폰의 상태를 컴퓨터로 보고 싶은것인가요?
아무튼 서버 런 상태를 토글로 관리하고 싶으시면
간단하게 서버 런 상태 플래그 하나 넣으시고(이 값을 Preference 등에 저장하셔서 보존되도록 하시구요)
버튼 넣으셔서 런일 경우 서버소켓 닫아버리시구요.
런 상태가 아닐 경우 서버 소켓 열고 스래드 돌려서 accept대기하시면 될 것 같네요.
물론 위처럼 간단하게 구현한다면 문제가 많겠지만 서버와 클라이언트 구조를 안드로이드가 아닌 단순 자바로 먼저 숙지하시고 진행하시는 것이 맞을 것 같네요.
원하시는 답변이 될지 모르겠습니다.