한 디바이스에 2개의 앱을 만들어서

 

하나가 서버가 되고 다른 하나가 클라이언트가 되어 소켓 통신으로 채팅이 가능하게끔 만들려고 합니다.

 

PC서버 대 Android클라이언트 를 이용한 예제를 가지고 수정해서 구현하려고 하고 있습니다.

 

만들다 보니 소켓 통신에 대해 잘 알고 있어야 할 것 같아서 책도 살펴보고 구글링도 해보았으나, 명확히 이해하기가 어렵습니다...

 

현재 클라이언트 앱에서 PC서버로 텍스트 보내기 까지 가능한 상황인데,

 

일단 PC서버에서 클라이언트로 보내기도 가능하게 하고..

 

그 후에 앱끼리 통신을 하게 고쳐보려고 합니다.. 그래야 공부가 될 것 같아서...

 

굉장히 초보적인 질문일 것 같은데..

 

소켓 통신이라는게 accept() 메서드로 세션이 맺어지면? 계속 데이터 송수신이 가능한건가요?

 

아니면 한번 데이터가 오갈 때 마다 close() 해주고 다시 사용해야 하는건가요..? 

 

독학으로 하려니 힘든 부분이 많네요.. 많은 도움 부탁드리겠습니다..

 

아래 소스에서 서버에서도 송신 가능하게끔 하려면 어느 부분을 건드려야 되는지도 알려주시면 감사하겠습니다..

 

너무 막무가내로 질문해서 죄송합니다..

 

 

서버 

public class TCPserver implements Runnable {
 public static final int ServerPort = 5000;
 public static final String ServerIP = "192.168.0.91"; 
 public void run() {
  try {
   System.out.println("S: Connecting...");
   ServerSocket serverSocket = new ServerSocket(ServerPort);
   while (true) {
    Socket client = serverSocket.accept();
    System.out.println("S: Receiving...");
    try {
     BufferedReader in = new BufferedReader(
       new InputStreamReader(client.getInputStream(), "UTF-8"));
     String str = in.readLine();
     System.out.println("S: Received: '" + str + "'");
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(client.getOutputStream(), "UTF-8")),
       true);
     out.println("Server Received " + str);
     
    } catch (Exception e) {
     System.out.println("S: Error");
     e.printStackTrace();
    } finally {
     client.close();
    }
   }
  } catch (Exception e) {
   System.out.println("S: Error");
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  Thread desktopServerThread = new Thread(new TCPserver());
  desktopServerThread.start();
 }
}

 

클라이언트

public class TCPSocketTest extends Activity {
 private String return_msg;
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final EditText et = (EditText) findViewById(R.id.EditText01);
  Button btn = (Button) findViewById(R.id.Button01);
  final TextView tv = (TextView) findViewById(R.id.TextView01);
  btn.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    if (et.getText().toString() != null
      || !et.getText().toString().equals("")) {
     
     TCPclient tp = new TCPclient(et.getText().toString());
     tp.run();
     
     Toast t = Toast.makeText(getApplicationContext(),
       return_msg, Toast.LENGTH_LONG);
     t.show();
     tv.setText(return_msg);
    }
   }
  });
 }
 private class TCPclient implements Runnable {
  private static final String serverIP = "192.168.0.91";
  private static final int serverPort = 5000; 
  private String msg;
  public TCPclient(String _msg) {
   this.msg = _msg;
  }
  public void run() {
   try {
    InetAddress serverAddr = InetAddress.getByName(serverIP);
    Socket socket = new Socket(serverAddr, serverPort);
    try {
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream(), "UTF-8")),
       true);
     out.println(msg);
     BufferedReader in = new BufferedReader(
       new InputStreamReader(socket.getInputStream(), "UTF-8"));
     return_msg = in.readLine();
    } catch (Exception e) {
    } finally {
     socket.close();
    }
   } catch (Exception e) {
    }
  }
 }
}