こんにちは、サービスに問題があります。UDPServer を実装し、受信したパケットのメイン アクティビティにログインするアプリケーションを作成しています。アクティビティが閉じられてもサービスが開始されるようにしたいので、サービスを使用する必要があると思います。本当ですか?音楽プレーヤー サービスを問題なく実装するアプリを既に認識していますが、UDP サーバーのコードをサービスの onStart 関数に挿入すると、アプリケーションがクラッシュします。これは、udp サーバーに関するコードです。
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Create the socket using the serverAddress
//notifica("STARTING SERVER!", "UDP***Creating server" );
//System.out.println("UDP***Creating server");
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);
//create a buffer to copy packet contents into
byte[] buf = new byte[260];
//create a packet to receive
DatagramPacket packet = new DatagramPacket(buf, buf.length);
notifica("START!", "Server started!" );
while(true) {
try{
socket.receive(packet);
System.out.println("UDP***" + new String(packet.getData()));
notifica("RECEIVED!", new String(packet.getData()) );
} catch (Exception e) {
notifica("EXC_INT:", "UDP Received Exception! " + e.toString() );
}
}
問題はコマンドにあると思います:
socket.receive(packet);
実行をブロックし、何かが読み取られるのを待っています。メインプログラムがサービスの待機をブロックしないようにしたい.
サービスにタイムアウトとスリープコマンドを挿入しようとしましたが、結果はありません:
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Create the socket using the serverAddress
//notifica("STARTING SERVER!", "UDP***Creating server" );
//System.out.println("UDP***Creating server");
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);
//create a buffer to copy packet contents into
byte[] buf = new byte[260];
//create a packet to receive
DatagramPacket packet = new DatagramPacket(buf, buf.length);
notifica("START!", "Server started!" );
while(true) {
try{
socket.setSoTimeout( 100 );
socket.receive(packet);
System.out.println("UDP***" + new String(packet.getData()));
notifica("RECEIVED!", new String(packet.getData()) );
} catch (SocketTimeoutException e) {
//notifica("EXC:", "UDP No data received!" );
//Toast.makeText(getApplicationContext(), "UDP No data received!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
notifica("EXC_INT:", "UDP Received Exception! " + e.toString() );
}
try{
Thread.sleep(30000);
} catch (Exception e) {
notifica("EXC_INT_TIMER:", "Thread sleep exc! " + e.toString() );
}
}
ありがとう!