2015-01-17 1 views
0

로컬 네트워크에서 데이터를 송수신하는 앱을 개발 중입니다. 필자는 들어오는 UDP 패킷을 청취하는 서비스를 작성하기로 결정했습니다. 패킷이 다른 장치로부터 수신되면 서비스에 콜백을 통해 들어오는 메시지를 다시보고하여 뷰를 업데이트하고 서비스에서 메서드를 호출하는 작업에서 원하는 목적지로 보내십시오. 처음에는 접근 논리가 정확하고이 문제에 대한 올바른 도구 (서비스)를 선택했다는 것을 알고 싶습니다. 또한 코드에있는 서비스의 수신 방법에 문제가 있습니다. 이 방법 수신 에 오류를 범 :UDP 패킷 송수신을위한 서비스 작성 android

public class WifiService extends Service { 


private final IBinder mBinder = new WifiBinder(); 
private WifiInterface serviceCallbacks; 
public WifiService() { 

} 

public class WifiBinder extends Binder { 
    WifiService getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return WifiService.this; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 
public void setCallbacks(WifiInterface callbacks) { 
    serviceCallbacks = callbacks; 
} 
public String Listen_Report() { 
    String msg = ""; 
    try { 
     while (true) { 
      byte[] IncommingBuffer = new byte[1000]; 
      InetAddress localaddress = InetAddress.getByName("192.168.43.1"); 
      DatagramSocket rsc = new DatagramSocket(8008, localaddress); 
      DatagramPacket dgp = new DatagramPacket(IncommingBuffer, IncommingBuffer.length); 
      rsc.receive(dgp); 
      msg = new String(dgp.getData(), 0, dgp.getLength()); 
      serviceCallbacks.ReportBack(msg); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return msg; 
} 
public void Sendmsg(final InetAddress dst, final String msg) throws IOException { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       byte[] message = msg.getBytes(); 
       DatagramPacket packet = new DatagramPacket(message, message.length, 
         dst, 8008); 
       DatagramSocket dsocket = new DatagramSocket(); 
       dsocket.send(packet); 
       dsocket.close(); 
      } 

      catch (UnknownHostException e) { 
       Log.e("Error", e.getMessage()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

    } 
} 

그리고 이것은 인터페이스이다

public interface WifiInterface { 
void ReportBack(String msg); 
} 

이는 활동의 부분이다

btnRec.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mService.Listen_Report(); 

     } 
    }); 
btnSend.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       mService.Sendmsg(InetAddress.getByName("192.168.43.83"),"From Activity"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 



public void onStart(){ 
    super.onStart(); 
    // Bind to LocalService 
    Intent intent = new Intent(this, WifiService.class); 
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

} 
protected void onStop() { 
    super.onStop(); 
    // Unbind from the service 
    if (mBound) { 
     unbindService(mConnection); 
     mBound = false; 
    } 
} 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
            IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     WifiService.WifiBinder binder = (WifiService.WifiBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
     mService.setCallbacks(mainMenu); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 


@Override 
public void ReportBack(String msg) { 
    txtRec.setText(msg); 
} 
+0

이 서비스는 메시지를 사용하고 지시되지 않은 다른 활동으로 연락한다 함수 호출. 샘플보기 : http://developer.android.com/reference/android/app/Service.html#LocalServiceSample – ata

답변

0

글쎄, 당신은 어떤 오류가 발생했는지 말해야했는데, 나는 supos 그것은 NetworkOnMainThreadException입니다.

첫째, 당신이 전화하는거야 : 메인 스레드에서

btnRec.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     mService.Listen_Report(); 

    } 
}); 

. BroadcastMessages를 사용하여 서비스와 comunicate하는 경우 (Ata가 말한대로) 서비스는 주 스레드에서 실행되므로 동일한 문제가 발생합니다.

send 메서드를 사용한 것처럼 다른 스레드에서 receive 메서드를 실행해야합니다.

public void Receivemsg() throws IOException { 
    new Thread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (true) { 
      byte[] IncommingBuffer = new byte[1000]; 
      InetAddress localaddress = InetAddress.getByName("192.168.43.1"); 
      DatagramSocket rsc = new DatagramSocket(8008, localaddress); 
      DatagramPacket dgp = new DatagramPacket(IncommingBuffer, IncommingBuffer.length); 
      rsc.receive(dgp); 
      msg = new String(dgp.getData(), 0, dgp.getLength()); 
      serviceCallbacks.ReportBack(msg); 
     } 
    } 
    }).start(); 

    } 
} 

그리고 : (콜백이 메인 스레드 외부에서 호출 될 것이다)

마지막
public void Listen_Report() 
{ 
    try 
    { 
     Receivemsg(); 
    } 
    catch (UnknownHostException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (SocketException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

그리고

@Override 
public void ReportBack(String msg) { 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      txtRec.setText(msg); 
     } 
    } 

}