2012-01-11 40 views
0

這與我以前的帖子「http://stackoverflow.com/questions/8788825/linux-udp-server-unreachable-from-window-7」,它已經解決了。現在我正轉向將AVD連接到Linux服務器的原始工作。在Windows7上的AVD無法連接到Linux服務器

我使用下面的代碼連接到

import java.net.*; 

class UDPClient { 

public final static int DesitnationPort = 9999; 
private int mCounter; 
private DatagramSocket mClientSocket; 
private InetAddress mServerIPAddress; 
private byte[] mDataBuffer; 
private DatagramPacket mSendPacket; 
private DatagramPacket mReceivePacket; 

//Constructor 
public UDPClient() { 

    //Time to make the private data good one 
    mCounter =1; 
    try { 
    mServerIPAddress = InetAddress.getByName("192.168.2.2"); 
    } 
    catch(UnknownHostException e) 
    { 
     System.out.println("Host cannot be resolved :("); 
    } 
    System.out.println("Host has been resolved The IP is valid one "); 
    try { 
    mClientSocket = new DatagramSocket(); 
    } 
    catch(SocketException e) 
    { 
     System.out.println("Socket could not be created :(==> " + e.getMessage()); 
    } 
    System.out.println("Socket has been created "); 
    String temp = "This is from the Client == To my Dear Sever :) counter = " + mCounter; 
    mDataBuffer = temp.getBytes(); 
    mSendPacket = new DatagramPacket(mDataBuffer, mDataBuffer.length, mServerIPAddress, DesitnationPort); 
    System.out.println("Datagram has been made now "); 
    System.out.println("Data ==>"+ mSendPacket.getData()); 
    System.out.println("Data ==>"+ mSendPacket.getPort()); 
    System.out.println("Data ==>"+ mSendPacket.getSocketAddress()); 
    System.out.println("Data ==>"+ mSendPacket.getLength()); 
} 

public void SendDataToServer(){ 

    try { 
      if(!mClientSocket.isClosed()) { 

       String temp = "This is from the Client == To my Dear Sever :) counter = " + mCounter; 
       mDataBuffer = temp.getBytes(); 
       mSendPacket = new DatagramPacket(mDataBuffer, mDataBuffer.length, mServerIPAddress, DesitnationPort);   
       mClientSocket.send(mSendPacket); 
       System.out.println("Send the packet"); 
       mCounter++; 
      } 
      else { 

       System.out.println("Socket is closed"); 
      } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Could not send the data :(==> " + e.getMessage()); 
    } 
} 

public void ReceiveDataFromServer() { 

    byte[] tembuff = new byte[1024]; 
    mReceivePacket = new DatagramPacket(tembuff, tembuff.length); 
    try { 
      if(!mClientSocket.isClosed()) { 

       mClientSocket.receive(mReceivePacket); 

      } 
      else { 

       System.out.println("Socket is closed"); 
      } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Could not Receive the data :("); 
     return; 
    } 
     String data = new String(mReceivePacket.getData()); 
     System.out.println(" Received the Data => " + data); 
} 
} 

此代碼工作得很好,當我簡單地使用了類在Java程序是這樣的服務器: -

class TryingWithClient { 
public static void main(String a[]) { 
    UDPClient mClient = new UDPClient(); 
    while(true) { 
    System.out.println("While Starting"); 
    mClient.SendDataToServer(); 
    mClient.ReceiveDataFromServer(); 
    } 
} 
} 

當我使用在AVD項目相同的代碼,我在下面的行得到一個空指針異常: -

public void SendDataToServer(){  
    try { 
     if(!mClientSocket.isClosed()){ //<[email protected] this call Null exception occurs 

BR後瀏覽互聯網& android開發網站我得出結論,我錯過了我添加到我的AVD的GMS/GPS功能。儘管如此,我仍然無法獲得任何線索。

這是我的代碼,它調用上面的UDPClient。

public class StreamingProjectActivity extends Activity { 
/** Called when the activity is first created. */ 

//All buttons 
//private static final String LOG_TAG = "StreamingTest";  
private StreamButton mStreamButton = null; 
private UDPClient mClient= null; 

class StreamButton extends Button { 
    boolean mStartStreaming = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onStream(mStartStreaming); 
      if (mStartStreaming) { 
       setText("Stop Streaming"); 
      } else { 
       setText("Start recording"); 
      } 
      mStartStreaming = !mStartStreaming; 
     } 
    }; 

    public StreamButton(Context ctx) { 
     super(ctx); 
     setText("Start Streaming"); 
     setOnClickListener(clicker); 
    } 
}//class StreamButton Ends 

@Override 
public void onCreate(Bundle icicle) { 
    try { 

     mClient = new UDPClient(); 
     System.out.println("==========> Client created sucessfully :) <====== "); 

     super.onCreate(icicle); 

     LinearLayout ll = new LinearLayout(this); 
     mStreamButton = new StreamButton(this); 
     ll.addView(mStreamButton, 
     new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      0)); 

     setContentView(ll); 
     System.out.println("Trying Step 2 now "); 
} 
catch(Exception e) 
{ 
    System.out.println("Activity could not be launched :("); 
} 

} 

//public StreamingTest() 
public StreamingProjectActivity(){ 
System.out.println("Constructor ====>"); 
System.out.println("Constructor <===="); 
}//Constructor 

private void onStream(boolean start) { 
    if (start) 
    { 
     mClient.SendDataToServer(); 
     mClient.ReceiveDataFromServer(); 
     try 
      { 
      Thread.sleep(4000); 

      }catch (InterruptedException ie) 
      { 
       System.out.println(ie.getMessage()); 
      } 

    } 
}//onStream 
} 

請幫忙。

回答

0

我早期的解決方案中的問題是,我在稱爲「StricMode.ThreadPolicy」的同一個線程中混合了GUI &網絡操作(儘管我的問題只是行話中提到的部分內容)。

我得到這些例外「android.os.NetworkOnMainThreadException & android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)」我可以讓出後,才申請WarrenFaith的建議(感謝沃倫)。

這些僅在違反「StricMode」時被拋出。

解決方案:簡單地將UI工作與網絡分開。我不得不寫這下面的代碼:

enum ClientThreadStates { 
eUndefined, 
eStopped, 
eRunning, 
eIdle, 
eSendToServer, 
eReadFromServer 
} 

public class ClientThread extends Thread { 

private UDPClient mClient= null; 
private ClientThreadStates mStateOfTheThread = ClientThreadStates.eUndefined; 
private static String mLOG_TAG; 

public ClientThread(String s){ 

    mLOG_TAG = s; 
    mStateOfTheThread = ClientThreadStates.eStopped; 
    mClient = new UDPClient(s); 
    start(); 
}//constructor 

public void SetState(ClientThreadStates paramState) { 

    mStateOfTheThread = paramState; 
} 

public ClientThreadStates GetState() { 

    return mStateOfTheThread; 
} 
private void Action(ClientThreadStates s) { 

    synchronized(s) { 

     switch(mStateOfTheThread) { 

     case eRunning: //fall 
     case eIdle: break; 
     case eSendToServer: mClient.SendDataToServer(); break; 
     case eReadFromServer: mClient.ReceiveDataFromServer(); break; 

     } 
     try { 
      mStateOfTheThread.wait(); 
     } 
     catch(InterruptedException e){ 
      Log.e(mLOG_TAG, "Got Exception at wait <==", e); 
     }   

    } 
} 

public void run() { 
    mStateOfTheThread = ClientThreadStates.eRunning; 
    System.out.println("In Thread.run .. The State is " + mStateOfTheThread); 
    while(ClientThreadStates.eStopped.compareTo(mStateOfTheThread) < 0){ //state >stopped 

     Action(mStateOfTheThread); 
    }//while 

}//run 
}//class ClientThread 

上的狀態下,兩個線程這樣最後同步:

private void onStream(boolean start) { 

    ClientThreadStates State = mClientThread.GetState(); 
    synchronized(State) { 
     if (start) { 
      mClientThread.SetState(ClientThreadStates.eSendToServer); 
     } 
     else  { 
      mClientThread.SetState(ClientThreadStates.eReadFromServer); 
     } 
     try {    
      State.notify(); 
     } 
     catch(IllegalMonitorStateException e) { 
       Log.e(LOG_TAG, "Got Exception @ notify <==", e); 
     }   
    } 
}//onStream 

}//StreamingProjectActivity 

現在的代碼運行完美。

謝謝。 Ashutosh

1

好的,首先:永遠不要用System.out.println("some msg " + e.getMessage());打印出一個突出的異常請使用Log.e(TAG, "my message", e);。所以你會看到一個堆棧跟蹤。

二:我打賭,這個代碼拋出錯誤(請檢查您是否看到打印在logcat的輸出):

try { 
    mClientSocket = new DatagramSocket(); 
} catch(SocketException e) { 
    System.out.println("Socket could not be created :(==> " + e.getMessage()); 
} 

這是唯一的原因,mClientSocket仍可能爲空。由於此調用可能出錯,因此在檢查套接字是否關閉之前,應考慮檢查null。

+0

感謝信心的指導。 我應用了你的建議,這實際上讓我產生了問題的原因。 問題發生在發送呼叫和解決方案的異常/谷歌分析後, 我發現原因是「StrictMode.ThreadPolicy」在這裏定義:=>「http://developer.android.com/reference /android/os/StrictMode.ThreadPolicy.html「; 解決方案可以在這裏找到:=> http://developer.android.com/resources/articles/painless-threading.html; 雖然我沒有使用在那裏定義的AsyncTask,但我設法分開線程及其按預期工作。 – Fooo 2012-01-11 20:04:36