안드로이드 개발 질문/답변
(글 수 45,052)
자바 소켓 통신 채팅 예제를 가지고 안드로이드로 바꿔보려고 합니다.
클라이언트앱 / 서버앱 이런식으로 바꿔보려고 합니다.
며칠째 붙잡고 하고 있는데.. 아무리 해도 안되네요..
자바 소스 좀 보시고, 어떻게 바꾸면 될지 방향 좀 잡아주시면 감사하겠습니다..
서버 소스
public class Server { public static void main(String ags[]) { try{ ServerSocket server = new ServerSocket(8088);//ServerSocket 객체 생성, 포트8088 Socket cSocket = server.accept();//tcp연결 기다려서 연결되면 연결된 소켓 반환 BufferedReader in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));//input스트림 가져오기 PrintWriter out = new PrintWriter(cSocket.getOutputStream(),true);//output스트림 가져오기,true는 자동flush BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//키보드입력할 버퍼
Thread thread2 = new OutputThread(in, cSocket);//쓰레드2 객체 생성 thread2.start();//쓰레드2 시작 : 메시지 전송하는 동작(OutputStream) String str = null; while(true) { str = br.readLine();//키보드 입력받기 out.println(str);//입력받은 내용을 outputStream을 이용해 전송 if(str.equals("bye"))//읽어온 텍스트가 "bye"면은 { System.exit(0);//프로그램 종료 } } }catch(IOException e){} } }
class OutputThread extends Thread//쓰레드2 : 메시지 전송하는 동작 정의(OutputStream) { BufferedReader in; Socket cSocket;
public OutputThread(BufferedReader in, Socket cSocket) { this.in = in; this.cSocket = cSocket; }
public void run() { try{ String str = null; while(true)//무한 루프 { str = in.readLine();//inputStream에서 데이터 가져옴 System.out.println("클라이언트 : " + str);//받은 내용 출력 if(str.equals("bye"))//"bye"입력시 { cSocket.close();//소켓 연결 끊고 System.exit(0);//프로그램 종료 } } }catch(IOException e){} } }
클라이언트 소스
public class Client { public static void main(String args[]) { try{ Socket cSocket = new Socket("127.0.0.1", 8088);//Socket 객체 생성<-127.0.0.1 주소의 8088포트로 연결 PrintWriter out = new PrintWriter(cSocket.getOutputStream(),true);//output스트림 가져오기 BufferedReader in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));//input스트림 가져오기 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//키보드입력할 버퍼 Thread thread2 = new InputThread(in); thread2.start();//쓰레드2 스타트 : 메시지 받는 동작(inputStream) String str = null; while(true)//무한루프 { str = br.readLine();//키보드 입력받기 out.println(str);//입력받은 내용을 outputStream을 이용해 전송 if(str.equals("bye"))//입력한 내용이 "bye"면은 { cSocket.close();//소켓을 닫고 System.exit(0);//프로그램 종료 } } }catch(IOException e){} catch(Exception ee){} } }
class InputThread extends Thread//쓰레드2 : 메시지 받는 동작 정의(InputStream) { BufferedReader in;//inputStream
public InputThread(BufferedReader in) { this.in = in; } public void run() { String str=null; while(true) { try{ str = in.readLine();//inputStream에서 데이터 가져옴 System.out.println("서버 : " + str);//받은 내용 출력 if(str.equals("bye"))//받은 내용이 "bye"면은 { System.exit(0);//프로그램 종료 } }catch(IOException e){} } } }
위 자바 소스를 가지고 안드로이드로 바꾸려고 하고 있습니다..
소스 보시면 아시겠지만.. 자바에선 콘솔로 입력받는 것을
EditText로 입력받아서 Button 만들어주고 클릭하면 전송하게끔 고쳐봤는데 잘 안됩니다..
정말 이렇게도 해보고 저렇게도 해봤는데... 도무지 답을 못찾고 있습니다.
아래는 제가 고쳐 본 소스입니다..
package choi.test.server;public class ServerApp extends Activity implements Runnable{
public static TextView chatting; public static EditText inText; public static Button sendBtn; public static ServerSocket server; public static Socket client; public static String str = ""; public static Thread ServerThread; public static PrintWriter out; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
chatting = (TextView) findViewById(R.id.chatText); inText = (EditText) findViewById(R.id.inText); sendBtn = (Button) findViewById(R.id.send);
ServerThread = new Thread(new ServerApp()); ServerThread.start(); sendBtn.setOnClickListener(new OnClickListener() { // 전송 버튼 public void onClick(View v) { String it = inText.getText().toString(); out.println(it); } }); }
public void run() { setServer(); process(); } public void setServer(){ try { server = new ServerSocket(8088);// ServerSocket 객체 생성, 포트8088 } catch (IOException e) { e.printStackTrace(); } } public void process(){ while (true) { try { client = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); str = in.readLine(); out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(client.getOutputStream())), true); // out.println("Server Received " + str); chatting.setText("클라이언트 : " + str); } catch (Exception e) { e.printStackTrace(); } } } }
public class ClientApp extends Activity implements Runnable{ public static Button sendBtn; public static Socket cSocket; public static String str = ""; public static EditText inText; public static TextView chatting; public static PrintWriter out; public static BufferedReader in; public static Thread ClientThread; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); chatting = (TextView) findViewById(R.id.chatText); inText = (EditText) findViewById(R.id.inText); sendBtn = (Button) findViewById(R.id.send); ClientThread = new Thread(new ClientApp()); ClientThread.start(); sendBtn.setOnClickListener(new OnClickListener() { // 전송 버튼 public void onClick(View v) { String it = inText.getText().toString(); out.println(it); // 널포인트 에러가 나는 부분 } }); }
public void run() { try{
String serverIP = InetAddress.getLocalHost().getHostAddress(); InetAddress serverAddr = InetAddress.getByName(serverIP); cSocket = new Socket(serverAddr, 8088);//Socket 객체 생성 8088포트로 연결 in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));//input스트림 가져오기 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(cSocket.getOutputStream())), true); while (true) { str = in.readLine();// input스트림에서 데이터 읽어오기
chatting.setText("서버 : " + str); } }catch(IOException e){ } } }
어떻게 하면 바꿀 수 있을지 좀 알려주시면 감사하겠습니다..
며칠째 보니까 이젠 봐도 같은 생각만 드는것 같네요..
2012.02.08 11:05:08
음.. 제가 알고자 하는 것은 위의 자바 소스를 안드로이드로 바꾸려면..
어떤식으로 하면 좋을지가 알고 싶습니다.
예를 들면 스레드를 3개를 사용해서 커넥션, 송신, 수신을 따로 나눈다거나...
어떤 부분은 핸들러를 이용해야 한다거나...
어떤식으로 하면 좋을 것 같은지에 대해서 설명해주시면 굉장히 도움 많이 될 것 같습니다..
제가 생각한대로는 안드로이드에는 콘솔입력이 아니니까 입력부분의 while문은 필요 없을 것 같고,
받아오는 부분만 따로 스레드로 while 돌려서 받아오면 될거라고 생각하고 짜보기도 했는데.. 잘 안되는 것 같습니다..
어디에서 어떻게 문제가 발생되는지 알려주셔야 합니다. ^^
대부분 직장인들이라 남에 소스 일일이 훌터보는 시간이 없답니다.
본인 소스도 훌터볼 시간이 없어서 ㅋㅋ