【问题标题】:Socket For Android Emulator Works but Not For Real DeviceAndroid 模拟器的 Socket 可以工作,但不能用于真实设备
【发布时间】:2026-01-21 23:30:02
【问题描述】:

我有通过 ip 将字符串发送到 python 脚本的 java 代码。该代码与模拟器完美配合,但是当我通过 USB 成功将应用程序安装到我的手机时,它不起作用。代码如下:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {
    public String message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button btn_python = findViewById(R.id.python);
        final Button btn_movie = findViewById(R.id.movie);
        final Button btn_hw = findViewById(R.id.homework);
        btn_python.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view1) {
                send py = new send();
                message = "python";
                Log.i("Button", "Button works");
                System.out.println("whatever");
                py.execute();
            }
        });
        btn_movie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view2) {
                send mov = new send();
                message = "movie";
                mov.execute();
            }
        });
        btn_hw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view2) {
                send hw = new send();
                message = "homework";
                hw.execute();
            }
        });
    }
    class send extends AsyncTask<Void,Void,Void>{
        Socket s;
        PrintWriter pw;
        @Override
        protected Void doInBackground(Void...params) {
            System.out.println("whatevernumbertwo");
            try {
                System.out.println("whatevernumberthree");
                s = new Socket("ip address", 7800);
                Log.i("Socket", "connects to socket");
                pw = new PrintWriter(s.getOutputStream());
                Log.i("output stream", "Output stream works");
                pw.write(message);
                Log.i("write", "Write works");
                pw.flush();
                Log.i("flush", "Flush works");
                pw.close();
                s.close();
            } catch (UnknownHostException e) {
                System.out.println("Fail");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("Fail");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }  
            return null;
        }
    }
}

正如我提到的,这适用于模拟器,但不适用于实际设备。也给予了适当的许可。我究竟做错了什么?提前致谢。

【问题讨论】:

    标签: android sockets android-emulator


    【解决方案1】:

    经过一番挖掘,原来它一直是服务器的防火墙。这就解释了为什么(显然)没有抛出异常,以及为什么代码似乎没有执行;它正在执行,只是卡在Socket() 中(在连接期间)。

    Socket() 肯定是,事实上,抛出一个IOException;可能只需要一段时间。

    代码可以在模拟器上运行,因为它在同一台机器上运行,它位于防火墙后面。

    【讨论】:

      最近更新 更多