0

私はこれで初心者なので、私がばかげた質問をした場合は、私を許してください。

Eclipse の PC エミュレーターと Android フォン
間 (または 2 つの Android フォン デバイス間) で UDP 接続を確立しようとしています。

ルーターがあり、電話はルーターのwifiネットワークを介してインターネットに接続しています。PC も同じネットワーク上にあります (直接ケーブル ルーター - PC 接続)。サーバー スレッドからクライアント スレッドにテキスト データを送信しようとしていますが、何も送受信されません。:(

サーバーJava クラス (再編集、サーバーはクライアントからメッセージを受け取ります):

public class server implements Runnable 
{
    // the Server's Port
    public static final int SERVERPORT  = 6000;

    // running Server thread.
    public void run() 
    {
        Log.d("redwing","server thread started.");
        DatagramSocket serverSocket = null;

        try
        {
            // Open Server Port
            serverSocket = new DatagramSocket(server.SERVERPORT);
            byte[] receiveData  = new byte[32];
            byte[] sendData     = new byte[32];
            // loop until "server_finished"  becomes False.
            while(createserver.server_finished)
            {
                if(renderer.gGL!=null)  // ignore me, just a null pointer checker
                {
                    // waiting for the incoming client's message packet
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    serverSocket.receive(receivePacket);
                    renderer.recv = new String(receivePacket.getData());
                    Log.d("server","packet received from client, ETA " + timing.getNow() + " " + renderer.recv); // timing getNow - just returns current system minute & second.

                    // server is replying to the client back with a message.
                    InetAddress IPAddress = receivePacket.getAddress();
                    int port = receivePacket.getPort();

                    sendData = new String("server msg").getBytes();
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                    serverSocket.send(sendPacket);
                    renderer.sent = new String(sendData, 0, sendData.length);
                    Log.d("server","packet sent to client, ETA " + timing.getNow() + " " + renderer.sent);     // timing getNow - just returns current system minute & second.
                }
            }
            // close the socket
            if(serverSocket!=null) serverSocket.close();
            serverSocket = null;
        }
        catch (Exception e) 
        {
            Log.e("server", "Error", e);
            if(serverSocket!=null) serverSocket.close();
            serverSocket = null;
        }
        finally 
        {
            if(serverSocket!=null) serverSocket.close();
            serverSocket = null;
        }
        Log.d("redwing","server thread terminated.");
    }
}

およびクライアントのJavaクラス(再編集、クライアントはサーバーからメッセージを受信しません):

public class client implements Runnable 
{
    public static final int CLIENTPORT  = 5000;
    // running Client thread.
    public void run() 
    {
        Log.d("redwing","client thread started.");
        DatagramSocket clientSocket = null;

        try
        {
            // getting local address 
            clientSocket = new DatagramSocket(server.SERVERPORT);
            InetAddress IPAddress = InetAddress.getByName("192.168.0.100");  

            // displaying IP & hostname.
            Log.d("client", "IP: " + IPAddress.getHostAddress() + " Name: " + IPAddress.getHostName());
            byte[] sendData     = new byte[32];
            byte[] receiveData  = new byte[32];
            // Loop until client_finished becomes False.
            while(createclient.client_finished)
            {
                if(renderer.gGL!=null)  // ignore me, just a null pointer checker
                {
                    // sending a message to the server
                    sendData = timing.getNow().getBytes();
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, client.CLIENTPORT);
                    clientSocket.send(sendPacket);
                    renderer.sent = new String(sendData,0,sendData.length);;
                    Log.d("client","packet sent to server, ETA " + timing.getNow());  

                    // waiting for the server packet message.
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    clientSocket.receive(receivePacket);
                    renderer.recv = new String(receivePacket.getData());
                    Log.d("client","packet received from server, ETA " + timing.getNow());
                }
            }
            // close the socket
            if(clientSocket!=null) clientSocket.close();
            clientSocket = null;
        }
        catch (Exception e) 
        {
            Log.e("client", "Error", e);
            if(clientSocket!=null) clientSocket.close();
            clientSocket = null;
        }
        finally 
        {
            if(clientSocket!=null) clientSocket.close();
            clientSocket = null;
        } 
        Log.d("redwing","client thread terminated.");
    }
}

マニフェストで権限が有効になっています。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<user-permission android:name="android.permission.NETWORK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Android PCエミュレーターでサーバーを実行し、Androidフォンでクライアントを実行しています。

クライアントとサーバーの両方のスレッドは正常に動作しますが、問題は、それらの間でデータが交換されないことです。クライアントは何も受信せず、サーバーは何も受信しません。パケットは送信されますが、何も受信されません。

何が間違っているのですか?

私を助けてください。
前もって感謝します。

4

1 に答える 1

1

エミュレーターを実行した後、コマンド プロンプトで「telnet localhost」と入力し、「redir add udp:5000:6000」と入力します。クライアントをポート番号 5000 で接続し、ポート番号 6000 で udp サーバーを開きます。これで、udp サーバーからクライアント メッセージを受信できます。

詳細を見てみる

clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("<pc ip>"); // instead of "localhost"


public static final String SERVERIP = "127.0.0.1"; // 'Within' the emulator!  
public static final int SERVERPORT = 6000;   

/* Retrieve the ServerName */  
InetAddress serverAddr = InetAddress.getByName(SERVERIP);  
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);  
于 2012-04-16T08:50:41.760 に答える