java - Android 套接字(客户端 - 服务器)

标签 java android sockets client-server

你好亲爱的程序员我需要你的帮助。

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

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



}

最佳答案

你不应该在“onCreate()”中连接网络,可以使用“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");
    }    
}

并在您的 onCreate 中添加此代码:

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

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

你可以在谷歌上搜索“AsyncTask”,并且有很多关于它的信息。它可能对您有用。

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

对不起我的英语不好

对不起,我又修改了代码

关于java - Android 套接字(客户端 - 服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290387/

相关文章:

java - 观察者模式与 MVC

c# - 为什么要编译成中间代码?

android - 任何用于从相机以连拍模式拍照的应用程序如何工作?

javascript - C++ 和远程 Javascript 之间的通信

c - Linux : TCP socket programming over multiple ethernet ports

c# - 如何在 C# 中有效地确定套接字的状态?

java - JApplet 未运行 : < No main classes found >

java - 在注入(inject)对象时强制创建对象的新实例

java - 以编程方式切换操作栏选项卡 - 如何附加参数?

Android - 签名 APK - Gradle 执行失败