0

こんにちは、サービスに問題があります。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() );
        }
    } 

ありがとう!

4

1 に答える 1

0

メインプログラムがsocket.receive(packet);でブロックしたくない場合は、スレッドを実装する必要があります。

これを行う1つの方法は、ブロッキングコードをここの下に配置することです。

新しいスレッド(){

 public void run(){

//たとえばここにブロッキングコードを配置します

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

}

}。始める();

また、問題を解決するためにタイムアウトとスリープを設定した場合は、クラッシュの問題が解決されないため、削除してください。

于 2013-02-20T09:06:57.357 に答える