繁体   English   中英

Windows7上的AVD无法连接到Linux服务器

[英]AVD on Windows7 Not able to connect to Linux Server

这与我以前的帖子“ 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开发站点后,我得出的结论是我缺少我添加到我的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
}

请帮助。

好的,首先:永远不要使用System.out.println("some msg " + e.getMessage());打印System.out.println("some msg " + e.getMessage());异常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的唯一原因。 由于此调用可能出错,因此在检查套接字是否关闭之前,应考虑检查null。

我以前的解决方案中的问题是,我将GUI和网络操作混合在称为“ StricMode.ThreadPolicy”的同一线程中(尽管我的问题只是术语中提到的一部分)。

我收到了这些异常“ android.os.NetworkOnMainThreadException和android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)”,只有在应用了WarrenFaith的建议(谢谢Warren)之后,我才能知道这些异常。

仅在违反“ 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

现在,代码可以完美运行。

谢谢。 阿舒托什

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM