简体   繁体   中英

Android Socket (Client - Server)

Hello dear programmers I need to your help.

I made a very very very simple java socket (client - server) project, what worked well. But when I used that client code to make it for android, it is not working, but I am making only client code for android, the server code is in Java again(may be I should make the server code in android too?)

Server(in Java)

public class DailyAdviceServer{  
  public void go() {
    try {
        ServerSocket serverSock = new ServerSocket(16242, 50);
        while (true)
        {
            Socket sock = serverSock.accept();

            PrintWriter writer = new PrintWriter(sock.getOutputStream());
            String advice = getAdvice();
            writer.println(advice);
            writer.close();
            System.out.println("smth");
        }
    } catch (IOException ex)
    {
        ex.printStackTrace();
    }
}



public static void main(String[] args)
{
    DailyAdviceServer server = new DailyAdviceServer();
    server.go();
}

}

Client(in Android)

public class MainActivity extends Activity  {


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            TextView tv = (TextView) findViewById(R.id.tv);     
            Socket s = new Socket("127.0.0.1", 4242);
            InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
            BufferedReader reader = new BufferedReader(streamReader);

            String advice = reader.readLine();

            tv.setText("Today you should: " + advice);
            reader.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }



}

You should not connect network in "onCreate()", and can use "AsyncTask"

String advice = ""; 

class MySyncTask extends AsyncTask<Integer, Integer, String>{
@Override
protected String doInBackground(Integer... params) {
       try{
           Socket s = new Socket("127.0.0.1", 4242);
           InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
           BufferedReader reader = new BufferedReader(streamReader);
           advice = reader.readLine();
           reader.close();
        }catch(Exception ex)
            ex.printStackTrace();
        }
        return advice;
    }

    protected void onPostExecute(String result) {
         tv.setText("Today you should: " + advice);
    }
    protected void onPreExecute() {
       log.i("start");
    }    
}

and add this code in you onCreate:

MySyncTask asyncTask=new MySyncTask (tv,pbar);
asyncTask.execute(1000);

My codes may have some error, you should check;

You can search "AsyncTask" on google, and have much information for it. It may be useful for you.

The works what need many time to do can not put in UI thread , mast put in background.

I am sorry for my bad english

I am sorry I have modfied my codes again

You need to flush after writing the data to make sure the data is sent. You can make the server on Android or Java, both works fine.Try this:

writer.println(advice);
writer.flush();

And dont forget the EOF for each and every data you send so the whole thing would be:

writer.println(advice + System.getProperty("line.separator"));
writer.flush();

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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