【问题标题】:Socket works on emulator not on device套接字适用于模拟器而不是设备
【发布时间】:2014-05-30 10:25:44
【问题描述】:

我有一个可以在模拟器上运行的应用,但在真实设备上测试时却不行。
整个程序:

public class MainActivity extends Activity {
    Socket socket;
    String strg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connect();
    }
    private void connect()
    {
        socket = null;
        Thread t = new Thread(new Runnable(){
            @Override
            public void run(){
                try {
                    InetAddress serverAddr = InetAddress.getByName("xx.xx.xx.xx");
                    socket = new Socket(serverAddr, x);
                    strg = "ok";
                    runOnUiThread(new Runnable(){
                        @Override
                        public void run(){
                            ((TextView)findViewById(R.id.output)).setText(strg);
                        }
                    });
                    socket.close();
                } catch (IOException e) {
                    final IOException exp = e;
                    runOnUiThread(new Runnable(){
                        @Override
                        public void run(){
                            strg = "ex2 "+exp.getMessage();
                            ((TextView)findViewById(R.id.output)).setText(strg);
                        }
                    });                     
                }                   
            }
        });
        t.start();  
    }
}

所以这是我所有的代码。
我连接到只能接受连接的外部 IP。
当我在模拟器上运行时strg 是“好的”并且服务器注册连接已经建立。
当我在设备上运行代码时,我收到错误消息。 "java.net.ConnectException: failed to connect to /xx.xx.xx.xx (port x): connect failed: ETIMEDOUT (Connection timed out)"

我有<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> & <uses-permission android:name="android.permission.INTERNET" />(否则模拟器无法运行)

有什么建议吗?

【问题讨论】:

  • 在 Android 上运行时,请确保您的端口号从 10.0.2.2 开始。
  • 您尝试使用外部 IP 地址。行。信息很明确。它无法连接。找出为什么。使用的端口是不是在路由器中没有转发?

标签: android sockets emulation device connect


【解决方案1】:

阅读有关StrictMode 的信息。您无法在 UI(磁盘、内存、网络)中执行长时间操作。模拟器不像真实设备那么严格。

【讨论】:

  • 他不需要那个,因为他已经使用了一个线程。此外,永远不要宣传 StrictMode。宣传使用 AsyncTask 或 Thread。
【解决方案2】:

所以我找到了解决方案,并且服务器防火墙上的错误设置阻止了我的请求。谢谢greenapps :)

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2020-01-16
    相关资源
    最近更新 更多