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

서버와 멀티캐스트 통신 시 클라이언트에서 Receive를 못합니다.

0 추천
안녕하세요.

안드로이드 프로그래밍을 공부하고 있는 다른 업계 직장인입니다.

아직 잘 몰라서, 용어 사용이 서투를지 모르겠습니다...

서버와 클라이언트간 통신 기능을 구현하려고 하는데요.

서버는 일반 JAVA 프로젝트로 구현했고, 클라이언트는 안드로이드 프로젝트로 구현했습니다.

클라이언트에서 서버로 전송하는 것은 잘 되는데,

서버에서 클라이언트로 멀티캐스팅을 해줄 때, 서버에서 SEND는 정상적으로 되는데,

클라이언트에서 RECEIVE할 때, 계속 SocketTimeout Exception이 납니다.

동일한 소스로 클라이언트를 일반 JAVA프로젝트로 구현하면, 정상적으로 수신이 되고요...

원인이 뭔지 도무지 모르겠어서 10시간 동안 헤맸습니다만, 결국 못 찾겠네요.

AndroidManifest에 인터넷권한 설정은 했고요

 

메인쓰레드에서 네트워크기능 사용할 수 있도록 아래와 같이 설정을 했는데, 혹시 그게 문제일가요?

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);

 

도움 주시면 감사하겠습니다.

클라이언트 소스는 아래와 같습니다.

public class MainActivity extends Activity {
 
 Socket clientSocket;
 String serverAddress = "192.168.42.221";
 String messageToSend = "asd>>>12345";
 MulticastSocket multicastSocket;
 InetAddress multicastGroup;
 public static final String MULTICAST_ADDRESS = "239.255.255.1";
 public static final int MULTICAST_LISTENING_PORT = 5555;
 public static final int SERVER_PORT = 12345;
 public static final int MESSAGE_SIZE = 512;
 
 TextView retMsg;
 EditText sendMsg;
 Button send;
 String return_message;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
  try
  {
   clientSocket = new Socket(InetAddress.getByName(serverAddress),SERVER_PORT);
  
   Formatter output = new Formatter(clientSocket.getOutputStream());
   output.format("%s\n", messageToSend);
   output.flush();
  
   multicastSocket = new MulticastSocket(MULTICAST_LISTENING_PORT);
   multicastGroup = InetAddress.getByName(MULTICAST_ADDRESS);
   multicastSocket.joinGroup(multicastGroup);
  
   multicastSocket.setSoTimeout(5000);
  
   byte[] buffer = new byte[MESSAGE_SIZE];
   DatagramPacket packet = new DatagramPacket(buffer, MESSAGE_SIZE);
   try
   {
    multicastSocket.receive(packet);

/////////////////////////////여기서 receive를 못합니다./////////////////////////

   }
   catch(SocketTimeoutException socketTimeoutException)
   {
    socketTimeoutException.printStackTrace();
   }
   catch(IOException ioException)
   {
    ioException.printStackTrace();
   }
   String return_message = new String(packet.getData());
   retMsg.setText(return_message);
   

  }
  catch(IOException ioException)
  {
   ioException.printStackTrace();
  }
  retMsg = (TextView)findViewById(R.id.RETURNMSG);
  sendMsg = (EditText)findViewById(R.id.SENDMSG);
  send = (Button)findViewById(R.id.SENDBUTTON);
  sendListener s_listener = new sendListener();
  send.setOnClickListener(s_listener);
  sendMsg.setText("1");
  retMsg.setText("asd");
 }
 

Logcat 내역은 다음과 같습니다.
08-14 08:58:16.577: E/Trace(689): error opening trace file: No such file or directory (2)
08-14 08:58:22.521: W/System.err(689): java.net.SocketTimeoutException
08-14 08:58:22.537: W/System.err(689):  at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:558)
08-14 08:58:22.537: W/System.err(689):  at libcore.io.IoBridge.recvfrom(IoBridge.java:516)
08-14 08:58:22.597: W/System.err(689):  at java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:161)
08-14 08:58:22.597: W/System.err(689):  at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:169)
08-14 08:58:22.597: W/System.err(689):  at java.net.DatagramSocket.receive(DatagramSocket.java:253)
08-14 08:58:22.597: W/System.err(689):  at com.example.chatting_appl_client.MainActivity.onCreate(MainActivity.java:67)
08-14 08:58:22.597: W/System.err(689):  at android.app.Activity.performCreate(Activity.java:5008)
08-14 08:58:22.597: W/System.err(689):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-14 08:58:22.607: W/System.err(689):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-14 08:58:22.607: W/System.err(689):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-14 08:58:22.617: W/System.err(689):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-14 08:58:22.617: W/System.err(689):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-14 08:58:22.617: W/System.err(689):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-14 08:58:22.617: W/System.err(689):  at android.os.Looper.loop(Looper.java:137)
08-14 08:58:22.617: W/System.err(689):  at android.app.ActivityThread.main(ActivityThread.java:4745)
08-14 08:58:22.617: W/System.err(689):  at java.lang.reflect.Method.invokeNative(Native Method)
08-14 08:58:22.627: W/System.err(689):  at java.lang.reflect.Method.invoke(Method.java:511)
08-14 08:58:22.627: W/System.err(689):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-14 08:58:22.627: W/System.err(689):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-14 08:58:22.647: W/System.err(689):  at dalvik.system.NativeStart.main(Native Method)
08-14 08:58:22.647: W/System.err(689): Caused by: libcore.io.ErrnoException: recvfrom failed: EAGAIN (Try again)
08-14 08:58:22.668: W/System.err(689):  at libcore.io.Posix.recvfromBytes(Native Method)
08-14 08:58:22.668: W/System.err(689):  at libcore.io.Posix.recvfrom(Posix.java:131)
08-14 08:58:22.708: W/System.err(689):  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
08-14 08:58:22.708: W/System.err(689):  at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
08-14 08:58:22.708: W/System.err(689):  ... 18 more

도와주세요.. ㅜㅜ
익명사용자 님이 2013년 8월 14일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...