마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소켓통신 서비스로 액티비티간에 소켓통신 유지에 관해서

0 추천
socketservice.java

package com.example.test;

import java.io.DataInputStream;

public class Socketservice extends Service {
 public String SERVERIP = "Ip주소";
 public int SERVERPORT = 3333;
 DataOutputStream out;
 DataInputStream in;
 int data;
 Socket socket;

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  System.out.println("I am in Ibinder onBind method");
  return myBinder;
 }

 private final IBinder myBinder = new LocalBinder();

 // TCPClient mTcpClient = new TCPClient();

 public class LocalBinder extends Binder {
  public Socketservice getService() {
   return Socketservice.this;
  }
 }
 @Override
 public void onCreate() {
  super.onCreate();
  System.out.println("I am in on create");
 }

 public void IsBoundable() {
  Toast.makeText(this, "I bind like butter", Toast.LENGTH_LONG).show();
 }

 public void sendData(int data) throws IOException {
  if (out != null) {
   out.writeInt(data);
  }
 }
 public void sendData(int data,int x,int y) throws IOException {
  if (out != null) {
   out.writeInt(data);
   out.writeInt(x);
   out.writeInt(y);
  }
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  super.onStartCommand(intent, flags, startId);
  System.out.println("I am in on start");
  Toast.makeText(this, "Service created ...", Toast.LENGTH_LONG).show();
  Runnable connect = new connectSocket();
  new Thread(connect).start();
  return START_REDELIVER_INTENT;
 }

 class connectSocket implements Runnable {

  @Override
  public void run() {

   try {
    // here you must put your computer's IP address.

    Log.e("TCP Client", "C: Connecting...");
    // create a socket to make the connection with the server

    socket = new Socket(SERVERIP, SERVERPORT);
    try {
     // send the message to the server
     out = new DataOutputStream(socket.getOutputStream());
     in = new DataInputStream(socket.getInputStream());
     Log.e("TCP Client", "C: Sent.");
     Log.e("TCP Client", "C: Done.");
     while (true) {
      data = in.read();
     }
    } catch (Exception e) {
     Log.e("TCP", "S: Error", e);
    }
   } catch (Exception e) {
    Log.e("TCP", "C: Error", e);
   }
  }
 }

 @Override
 public void onDestroy() {
  super.onDestroy();
  try {
   socket.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  socket = null;
 }

}

Keyboard.java

public class Keyboard extends Activity {
 public static final String LOG = "Log";
 DataInputStream socket_in;
 DataOutputStream socket_out;
 Socket socket;
 int data;

 Socketservice myservice = new Socketservice();
 private boolean myBound = false; // 서비스 연결 여부

 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
  Intent intent = new Intent(this, Socketservice.class);
  startService(intent);
  bindService(intent, conn, Context.BIND_AUTO_CREATE);
 }

 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  super.onStop();
  if (myBound) {
   unbindService(conn);
   myBound = false;
  }
 }

 private ServiceConnection conn = new ServiceConnection() {

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   // TODO Auto-generated method stub
   LocalBinder binder = (LocalBinder) service;
   myservice = binder.getService();
   myBound = true;
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   myBound = false;
  }
 };

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  @SuppressWarnings("unused")
  MenuItem item1 = menu.add(0, 1, 0, "선택화면");
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // TODO Auto-generated method stub

  switch (item.getItemId()) {
  case 1:
   stopService(new Intent(Keyboard.this, Socketservice.class));
   finish();
   return true;
  default:
   return super.onOptionsItemSelected(item);
  }
 }

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.keyboard);

실행할 버튼 객체들...

}

Mouse.java

public class Mouse extends Activity implements
  android.view.GestureDetector.OnGestureListener, OnDoubleTapListener {
 public static final String LOG = "Log";
 Button Button_Touch_Left;
 Button Button_Touch_Right;

 DataInputStream socket_in;
 DataOutputStream socket_out;
 Socket socket;
 int data;
 GestureDetector GestureDetector;

 
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  @SuppressWarnings("unused")
  MenuItem item1 = menu.add(0, 1, 0, "선택화면");

  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // TODO Auto-generated method stub

  switch (item.getItemId()) {
  case 1:
   finish();
   return true;
  default:
   return super.onOptionsItemSelected(item);
  }
 }

 Socketservice myservice = new Socketservice();
 private boolean myBound = false; // 서비스 연결 여부

 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
  Intent intent = new Intent(this, Socketservice.class);
  startService(intent);
  bindService(intent, conn, Context.BIND_AUTO_CREATE);
 }

 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  super.onStop();
  if (myBound) {
   unbindService(conn);
   myBound = false;
  }
 }

 private ServiceConnection conn = new ServiceConnection() {

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   // TODO Auto-generated method stub
   LocalBinder binder = (LocalBinder) service;
   myservice = binder.getService();
   myBound = true;
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   myBound = false;
  }
 };

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.mouse);

마우스 버튼 객체들 .....

}

이렇게 있는데 선택화면은 액티비티 키보드와 마우스를 선택할 인텐트로만 되어있습니다.

근데 여기서 제가 질문할 요지는

처음에 키보드와 마우스를 둘중에 하나를 선택해서

서버 pc를 원격제어하는것으로 소켓통신으로 하는건데

예를 들면 처음에 마우스를 먼저 소켓을 연결해서 서비스를 사용하면

이용이 가능합니다. 하지만 선택화면으로 액티비티가 이동되고

키보드를 가면 아무것도 데이터가 전송이 되질 않습니다.

키보드를 사용했다가 마우스도 사용하려고 하고싶어서 소켓서비스를

따로 해서 했는데도 되질 않아서 일주일내내 답답하게 있습니다

답변 부탁드립니다.
열심히하는 (160 포인트) 님이 2014년 11월 8일 질문

1개의 답변

0 추천
설명만 읽고 답변드립니다.

설명을 보니 액티비티가 바뀌시는거 같은데요.

액티비티가 바뀌면 소켓은 공유되지 않습니다.

서비스를 이용해보세요.
아이진 (560 포인트) 님이 2014년 11월 9일 답변
액티비티가 바꼈다는 소리가 무슨소리에요? 서비스를 이용하면서 하고잇는뎅 startService(intent) - > bindService();를 호출하는게 아닌가요?
제가 지금 서비스를 이용하는게 아닌가요? startService(intent)를 호출해서 서비스를 이용하고있는데
...