자바 소켓 통신 채팅 예제를 가지고 안드로이드로 바꿔보려고 합니다.

 

클라이언트앱 / 서버앱 이런식으로 바꿔보려고 합니다.

 

며칠째 붙잡고 하고 있는데.. 아무리 해도 안되네요..

 

자바 소스 좀 보시고, 어떻게 바꾸면 될지 방향 좀 잡아주시면 감사하겠습니다..

 

 

서버 소스

 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){
  }
 }
}


 

어떻게 하면 바꿀 수 있을지 좀 알려주시면 감사하겠습니다..

 

며칠째 보니까 이젠 봐도 같은 생각만 드는것 같네요..