Steven Salazar Molina
Steven Salazar Molina

Reputation: 73

AsyncTask and socket not working in android java

I'm making a simple app client-server in java, i want my phone to receive and send messages to my pc, i'm on same LAN and my pc's ip is 192.168.1.8, my serverSocket is running on port 7777. for some reason my client android cant connect i think it is because i created a socket in a thread, i have read that i should use AsyncTask or Handle, i tried with that too but i get an exception too.

Class server:

public class MyServer implements Runnable{


private ServerSocket server;
private ObjectInputStream in;
private ObjectOutputStream out;
private Socket clientedConnected;

public ExampleServerZNuC(){
    try {
        server= new ServerSocket(7777);
        System.out.println("server opened on port 7777");
    } catch (IOException ex) {
        Logger.getLogger(MyServer.class.getName()).log(Level.SEVERE, null, ex);
    }

}
public void sendMessage(String message){
    try {
        out.writeObject(message);
        out.flush();
    } catch (IOException ex) {
        Logger.getLogger(MyServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}
public void sendNotifiy(){
  try {
        out.writeObject("Send Notify");
        out.flush();
    } catch (IOException ex) {
        Logger.getLogger(MyServer.class.getName()).log(Level.SEVERE, null, ex);
    }

}
public String getMessage(){
  return "";
}
public void run(){
    System.out.println("method run started");
    System.out.println("Waiting for a client to connect");
    try {
        Socket clientedConnected;
        clientedConnected = server.accept();
        System.out.println("A client connected : "+clientedConnected.getInetAddress().getHostAddress());
        in= new ObjectInputStream(clientedConnected.getInputStream());
        out = new ObjectOutputStream(clientedConnected.getOutputStream());




                } catch (IOException ex) {
        Logger.getLogger(MyServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.println("End of method Run");
} }

this is the output i get when i create run the server:

 server opened on port 7777
 method run started
 Waiting for a client to connect

client android: class to connect to my server( atm i just want it to receive the message):

 import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.OptionalDataException;
 import java.net.Socket;
 import java.net.UnknownHostException;

 import android.util.Log;
 import android.view.View;
 import android.widget.TextView;

public class MyConnect implements Runnable{

private Socket myconnect=null ;
private TextView txtMessage;
private ObjectInputStream in; 
private ObjectOutputStream out;
public MyConnect( ){
    try {
        // this is my pc's IP, my phone is connected to same LAN
        Log.d("inizializating socket","");
        myconnect= new Socket("192.168.1.8",7777);
        in = new ObjectInputStream(myconnect.getInputStream());
        out = new ObjectOutputStream(myconnect.getOutputStream());
    } catch (UnknownHostException e) {
        Log.d("My Error connecting",e.getMessage());
    } catch (IOException e) {
        Log.d("My Error connecting",e.getMessage());
    }
 }
 @Override
 public void run() {
        try {
            String message = (String)in.readObject();
            Log.d("messaged recived",message);
        } catch (OptionalDataException e) {             
            Log.d("My Error connecting",e.getMessage());
        } catch (ClassNotFoundException e) {
            Log.d("Error My ClassNotFoundException",e.getMessage());
        } catch (IOException e) {
            Log.d("Error My IOEXCEPTION",e.getMessage());
        }





  }

 }

this is the error that i get when i click on a button that should create the socket: on create i use connect= new MyConnect(); and on onclick event i use:

   @Override
   public void onClick(View v) {
    switch(v.getId()){
    case R.id.btnExample:


        new Thread(connect).start();

        break;


    }

}

error message :

05-29 19:02:05.905: E/AndroidRuntime(6520): FATAL EXCEPTION: main
05-29 19:02:05.905: E/AndroidRuntime(6520):      android.os.NetworkOnMainThreadException
05-29 19:02:05.905: E/AndroidRuntime(6520):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at  libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at libcore.io.IoBridge.connect(IoBridge.java:112)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
 05-29 19:02:05.905: E/AndroidRuntime(6520):    at    java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at java.net.Socket.startupSocket(Socket.java:566)
05-29 19:02:05.905: E/AndroidRuntime(6520):     at java.net.Socket.tryAllAddresses(Socket.java:127)

EDIT:

class MySyncTask extends AsyncTask<Integer, Integer, String>{
    String advice;
@Override
protected String doInBackground(Integer... params) {

    try {
        s = new Socket("192.168.1.8",7777);
        Log.d("socket connected","");
         ObjectInputStream streamReader = new ObjectInputStream(s.getInputStream()); 

            advice = (String)streamReader.readObject();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

        return "";
    }

protected void onPostExecute(String result) {
     txtMessage.setText("you got a message: " + advice);
}
protected void onPreExecute() {
   Log.d("my started","start");
}    

}

and i used

  MySyncTask asyncTask=new MySyncTask ();
     asyncTask.execute();

on onCreate() method but for some reason it is not connecting to my server

LogCat with AsyncTask:

05-29 19:46:21.900: D/my started(26169): start
05-29 19:46:22.020: D/libEGL(26169): loaded /system/lib/egl/l ibEGL_mali.so
05-29 19:46:22.030: D/libEGL(26169): loaded /system/lib/egl/libGLESv1_CM_mali.so
05-29 19:46:22.040: D/libEGL(26169): loaded /system/lib/egl/libGLESv2_mali.so
05-29 19:46:22.080: D/OpenGLRenderer(26169): Enabling debug mode 0

EDIT PROBLEM SOLVED

after searching on internet why socket was not connecting i found someone who had a similar problem and i found the answer here Android Socket not being instantiated i had to initializate the socket first and then use connect

Upvotes: 1

Views: 1493

Answers (3)

Jorgesys
Jorgesys

Reputation: 126563

Like Eduardo points out,

NetworkOnMainThreadException

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

Use Asynctask for your connection

Be sure to have

<uses-permission android:name="android.permission.INTERNET" /> 

into your AndroidManifest.xml

Upvotes: 1

Raghu
Raghu

Reputation: 351

Have you set the proper permissions in the manifest? If yes, is the phone on the same network as your PC (if they are on same wifi network is good)? Try running through debugger and putting a break point.

Here is a nice tutorial that explains client/server communication in android. http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/

Good luck -Raghu

Upvotes: 0

Eddie Martinez
Eddie Martinez

Reputation: 13910

This is happening because you are trying to perform a networking operation on the main thread. This is bad design, you do not want to lock up the user interface while you run a process that can take long time to execute.

Put your network method in an AsyncTask or Service.

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Upvotes: 1

Related Questions