0

PCのJavaプログラムからテキスト文字列を送信し、エミュレーターのAndroidアプリから同じ文字列を受信しようとしている非常に単純なアプリを作成しています。

これは私の活動(サーバー)です:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_appstart);
    tv = (TextView) findViewById(R.id.textView1);
    try {
        DatagramSocket clientsocket = new DatagramSocket(9876);
        byte[] receivedata = new byte[1024];
        DatagramPacket recv_packet = new                   DatagramPacket(receivedata, receivedata.length);
        Log.d("UDP", "S: Receiving 1 sec...");
        clientsocket.receive(recv_packet);
        String rec_str = new String(recv_packet.getData());
        tv.setText(rec_str);
        Log.d(" Received String ", rec_str);
        InetAddress ipaddress = recv_packet.getAddress();
        int port = recv_packet.getPort();
        Log.d("IPAddress : ", ipaddress.toString());
        Log.d(" Port : ", Integer.toString(port));                                   clientsocket.close();
    } catch (Exception e) {
        Log.e("UDP", "S: Error", e);
    }
}

これが私のPCクライアントのJavaコードです。

  public static void main(String args[]) throws Exception
    {
            while(true)
    {           
    BufferedReader inFromUser = new BufferedReader(new       InputStreamReader(System.in));
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("127.0.0.1");
    System.out.println(IPAddress.getHostName());
            byte[] sendData = new byte[1024];
            byte[] receiveData = new byte[1024];
            String sentence = inFromUser.readLine();
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new    DatagramPacket(sendData,sendData.length,IPAddress,9876);
            clientSocket.send(sendPacket);
    System.out.println(sendPacket.getPort());
            clientSocket.close();
    }       
   }

onReceive()ただし、アプリは何も受信しませんが、Androidアプリの関数で例外をスローします。

誰かがその理由を知っていますか?

4

2 に答える 2

0

メインスレッドでネットワークメソッドを実行しているため、android.os.NetworkOnMainThreadExceptionが発生します。これにより、アプリが応答しなくなります。別のスレッドに入れてみてください。この場合は、アクティビティがバインドできるサービスである可能性があります。(例については、 android.os.NetworkOnMainThreadExceptionを修正する方法を参照してください)

UDPサービスをテストするだけでよい場合(推奨されません)、API要件を7以下に設定するか、メインスレッドポリシーでネットワークを無効にすることができます。例外は発生しません。ただし、アプリは非常に応答しなくなります。

于 2012-09-25T16:14:14.233 に答える
0

このPOCを試してください。パケットを送信およびリッスンします。リスナーを別のスレッドに分割する

package a.first;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;


public class Serv {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

        Listner listner = new Listner();
        Thread thread = new Thread(listner);
        thread.start();


        String messageStr = "Hello msg1";
        int server_port = 2425;
        DatagramSocket s = new DatagramSocket();
        InetAddress local = InetAddress.getByName("172.20.88.223");
        int msg_length = messageStr.length();
        byte[] message = messageStr.getBytes();
        DatagramPacket p = new DatagramPacket(message, msg_length, local,
                server_port);
        System.out.println("about to send msg1");
        s.send(p);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }
        messageStr = "Hello msg2";
        msg_length = messageStr.length();
        message = messageStr.getBytes();
        p = new DatagramPacket(message, msg_length, local,
                server_port);
        System.out.println("about to send msg2");
        s.send(p);
}


}
   class Listner implements Runnable
    { 
            @Override
            public void run() {
        String text = null;
        while(true){
            text = null;    
        int server_port = 2425;
        byte[] message = new byte[1500];
        DatagramPacket p = new DatagramPacket(message, message.length);
        DatagramSocket s = null;
        try{
           s = new DatagramSocket(server_port);
        }catch (SocketException e) {
            e.printStackTrace();
            System.out.println("Socket excep");
        }
        try {
        s.receive(p);
       }catch (IOException e) {
            e.printStackTrace();
                System.out.println("IO EXcept");
            }
        text = new String(message, 0, p.getLength());
        System.out.println("message = "+text);
        s.close();

    }
}

}
于 2013-02-22T11:19:42.667 に答える