로컬 네트워크에서 데이터를 송수신하는 앱을 개발 중입니다. 필자는 들어오는 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);
}
이 서비스는 메시지를 사용하고 지시되지 않은 다른 활동으로 연락한다 함수 호출. 샘플보기 : http://developer.android.com/reference/android/app/Service.html#LocalServiceSample – ata