Android Socket (Client - Server)

帅比萌擦擦* 提交于 2019-12-06 09:47:42

问题


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();
        }



}

回答1:


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




回答2:


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.



来源:https://stackoverflow.com/questions/20290387/android-socket-client-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!