Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编写用于发送和接收UDP数据包的服务_Android_Sockets - Fatal编程技术网

Android 编写用于发送和接收UDP数据包的服务

Android 编写用于发送和接收UDP数据包的服务,android,sockets,Android,Sockets,我正在开发一个在本地网络中发送和接收数据的应用程序。我决定编写一个服务来侦听传入的UDP数据包,当从其他设备接收到数据包时,该服务将通过对活动的回调来报告传入消息以更新视图。从活动中,我调用服务上的一个方法将其发送到所需的目的地。 首先,我想知道我的方法逻辑是否正确,我是否为此选择了正确的工具(服务)。 服务上的侦听方法也有问题,这就是代码。它给出了接收方法的错误: public class WifiService extends Service { private final IBinde

我正在开发一个在本地网络中发送和接收数据的应用程序。我决定编写一个服务来侦听传入的UDP数据包,当从其他设备接收到数据包时,该服务将通过对活动的回调来报告传入消息以更新视图。从活动中,我调用服务上的一个方法将其发送到所需的目的地。 首先,我想知道我的方法逻辑是否正确,我是否为此选择了正确的工具(服务)。 服务上的侦听方法也有问题,这就是代码。它给出了接收方法的错误:

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();

   }
}
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);
}
这是界面

public interface WifiInterface {
void ReportBack(String msg);
}
这是活动的部分

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();

   }
}
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);
}

嗯,你应该说你收到了哪个错误,但我怀疑这是NetworkOnMainThread异常

首先,你称之为:

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

    }
});
从主线程开始。 即使您使用BroadcastMessages与服务通信(正如Ata告诉您的),服务也会在主线程上运行,因此您也会遇到同样的问题

您必须在另一个线程中运行receive方法,就像使用send方法一样

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();
    }
}
最后(因为回调将在主线程之外调用)


其他活动应使用消息而不是直接函数调用联系服务。请参见此示例: