AVD на Windows7 Не удается подключиться к Linux Server - PullRequest
0 голосов
/ 11 января 2012

Это относится к моей предыдущей публикации "http://stackoverflow.com/questions/8788825/linux-udp-server-unreachable-from-window-7",, которая была решена. Теперь я перехожу к своей первоначальной работе по подключению 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()){ //<==@ this call Null exception occurs

После просмотра сайтов по разработке приложений для Интернета и Android я пришел к выводу, что мне не хватает функциональности GMS / GPS, которую я добавил в свой AVD. Тем не менее, я не могу получить никакой подсказкиоб этом.

Вот мой код, который вызывает вышеупомянутый 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
}

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 11 января 2012

Хорошо, во-первых: никогда не печатать перехваченное исключение с System.out.println("some msg " + e.getMessage()); Пожалуйста, используйте Log.e(TAG, "my message", e); для этого.Таким образом, вы фактически увидите трассировку стека.

Во-вторых: держу пари, что этот код выдает ошибку (проверьте, видите ли вы отпечаток в выходных данных LogCat):единственная причина, по которой mClientSocket все еще может быть нулевым.Поскольку этот вызов может пойти не так, вам следует рассмотреть возможность проверки на нулевое значение, прежде чем проверять, закрыт ли сокет.

0 голосов
/ 12 января 2012

Проблема в моем более раннем решении состояла в том, что я смешивал GUI и сетевые операции в одном и том же потоке, который называется «StricMode.ThreadPolicy» (хотя моя проблема - только часть того, что упоминается в жаргоне).

Я получаю эти исключения "android.os.NetworkOnMainThreadException & android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1099)", которые я смог разглядеть только после того, как применил предложение WarrenFaith (спасибо Уоррену).

Они генерируются только при нарушении режима StricMode.

Решение: просто отделите работу пользовательского интерфейса от сети. Я должен был написать следующий код для этого:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...