Android Socket(客户端 - 服务器)

时间:2013-11-29 16:54:43

标签: java android sockets client-server

亲爱的程序员,您需要我的帮助。

我做了一个非常非常简单的Java套接字(客户端 - 服务器)项目,效果很好。 但是当我使用那个客户端代码来制作它的android时,它不起作用,但我只为android制作客户端代码,服务器代码再次使用Java(也许我应该在android中制作服务器代码?)< / p>

服务器(使用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();
}

}

客户端(在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();
        }



}

2 个答案:

答案 0 :(得分:10)

您不应该在“onCreat()”中连接网络,并且可以使用“AsyncTask”

Stirng advice = ""; 

class MySyncTask extends AsyncTask<Integer, Integer, String>{
@Override
protected String doInBackground(Integer... params) {
       Socket s = new Socket("127.0.0.1", 4242);
        InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
        BufferedReader reader = new BufferedReader(streamReader);

        String advice = reader.readLine();
        reader.close

    }

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

}

并在onCreate:

中添加此代码
                        MySyncTask asyncTask=new MySyncTask (tv,pbar);
                    asyncTask.execute(1000);

我的代码可能有一些错误,您应该检查;

您可以在google中搜索“AsyncTask”,并为其提供许多信息。它可能对您有用。

需要很多时间做的工作不能放在UI线程中,桅杆放在后台。

我很抱歉我的英语不好

对不起,我再次修改了我的代码

答案 1 :(得分:2)

写入数据后需要flush以确保数据已发送。你可以在Android或Java上制作服务器,两者都可以正常工作。试试这个:

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

并且不要忘记您发送的每个数据的EOF,因此整个事情将是:

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

希望这有帮助。