【问题标题】:Android Socket (Client - Server)Android 套接字(客户端 - 服务器)
【发布时间】:2023-03-11 22:45:01
【问题描述】:

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

我做了一个非常非常简单的java socket(客户端-服务器)项目,效果很好。 但是当我使用该客户端代码为 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();
        }



}

【问题讨论】:

  • 看起来你正在连接到 localhost Android 端 - 你的意思是连接到你的服务器的 IP 地址(不是 Android 设备)
  • 您也不能在 Android 的主/ui 线程中进行网络连接(new Socket 等)。阅读:developer.android.com/training/basics/network-ops/…

标签: java android sockets client-server


【解决方案1】:

你不应该在“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);

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

您可以在 google 上搜索“AsyncTask”,并有很多信息。它可能对你有用。

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

对不起我的英语不好

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

【讨论】:

  • 非常感谢,现在我试试这个版本。
  • 再次感谢您,我是 StackOverflow 的新手,所以没有声誉,否则我会投票给您的答案,对不起
【解决方案2】:

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 非常感谢,但我什么都不懂。为什么相同的代码适用于java客户端但不适用于Android客户端(使用相同的服务器和客户端,即使没有它也适用于java:writer.println(advice + System.getProperty(“line.separator”)); writer.flush();
  • @user3050103 如果客户端和服务器在不同的设备上运行,您将无法连接到127.0.0.1。您需要将服务器 IP 放在该位置并通过 wifi 连接,以便手机可以访问该 IP。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2011-11-15
  • 1970-01-01
  • 2013-08-06
  • 2012-11-15
  • 1970-01-01
  • 2012-06-05
  • 2011-08-15
相关资源
最近更新 更多