2012-04-16 16 views
0

これで初心者ですので、私は愚かな質問をする場合は私を笑ってください。android UDP接続、データを受信して​​いません

EclipseのPCエミュレータ&とアンドロイド電話
(または2つのアンドロイドフォンデバイス間)にUDP接続をしようとしています。

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

サーバー Javaクラス(再編集、サーバはMSGを受信クライアントから。):

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クラス(再編集、 )サーバーからMSGを受け取る:

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

Permisionsは、マニフェストで有効になっています

<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"/> 

私はアンドロイドPCエミュレータでサーバを実行していて、アンドロイド携帯電話でクライアントを実行しています。

両方のクライアント&サーバスレッドはうまく動作しますが...問題は、それらの間で交換されたデータがないことです。 クライアントはanytingを受信せず、サーバーは何も受け取りません。パケットは送信されますが、何も受信されません。

何が間違っていますか?

私を助けてください。
ありがとうございます。

答えて

1

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

Take a look for details

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); 
+0

答えてくれてありがとう。エミュレータをロードした後、コマンドプロンプトを表示して「telnet localhost」を書きますが、コンソールに「localhostに接続しています...ポート23のホストへの接続を開くことができませんでした:接続に失敗しました」というエラーが表示されます – redbase

+0

telnetサービスが実行されていません。コントロールパネル、サービスからtelnetを起動したわけではありませんが、今はログインとパスの入力を求められます。これは何のため ? – redbase

+0

私の悪いことを申し訳ありません - コマンドプロンプトで "telnet localhost <エミュレータポート5554>"と入力し、上記の指示に従ってください。 –

関連する問題