【问题标题】:cannot get android app to connect to my server on my local computer无法让 android 应用程序连接到我本地计算机上的服务器
【发布时间】:2017-08-16 16:59:34
【问题描述】:

嗨,我是 android 新手,我是 试图让我的 android 应用程序连接到在我的本地计算机上运行的服务器。我只是想让应用程序先向服务器发送一条简单的字符串消息,但不断收到错误消息。从打印出来的语句中,我可以看到应用程序在遇到 try 的行后立即终止,所以我认为创建客户端连接存在问题。我还启用了 Internet、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限

我尝试将 localhost 更改为 InetAddress.getLocalHost() 但仍然无法正常工作

这是我的代码:

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

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import static java.net.InetAddress.getLocalHost;

public class MainActivity extends AppCompatActivity{
    private Button cam;
    private Socket client;
    DataOutputStream os;
    private String IP = "localhost";
    private static final String TAG = "testing";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (android.os.Build.VERSION.SDK_INT > 9)
        {
            StrictMode.ThreadPolicy policy = new                      
            StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        setContentView(R.layout.activity_main);



        cam = (Button) findViewById(R.id.Button_camera);
        cam.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                Log.v(TAG, "trying to connect to server");
                try {
                    client = new Socket("My IP address entered", 8080);
                    Log.v(TAG, "client socket initalised");
                    String hey = "hey";
                    os = new DataOutputStream(client.getOutputStream());
                    Log.v(TAG, "outptu stream created");
                    os.flush();
                    Log.v(TAG, "flush");
                    os.writeBytes(hey);
                    Log.v(TAG, "written to server");
                    os.close();


                } catch (UnknownHostException e) {
                    Log.v(TAG, "Unknown error");
                    Log.v(TAG, e.toString());
                } catch (IOException e) {
                    Log.v(TAG, "IO exception u numpty");
                    Log.v(TAG, e.toString());
                }
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                startActivity(intent);



            }
        });

    }
}

我的代码打印出试图连接到服务器的语句,但没有到达任何其他打印出的语句,我的服务器仍然没有收到任何东西

 connect failed: ETIMEDOUT (Connection timed out)
ACTION_DOWN before UnsetPressedState. invoking mUnsetPressedState.run()
I/Choreographer: Skipped 3792 frames!  The application may be doing too much work on its main thread.

【问题讨论】:

  • 10.0.0.2 被视为您的掩码名称,而不是您在网络中的 pc 地址
  • 我已将代码更改为使用我的 IP 地址运行,但仍然无法正常工作
  • 它说我输入的 ip 地址是我输入我的 ip 地址的地方,我通过谷歌搜索我的 ip 得到了我的 ip,会不会是 ipv4 或 ipv6 问题??
  • 你google看到的ip是你的internet modem地址,在终端输入“ipconfig”就可以看到你的网络地址
  • 我已经做到了,并尝试了 ip 仍然没有运气

标签: java android sockets client-server dataoutputstream


【解决方案1】:

我相信这绝对只是您的 IP 的问题,您显然给了 ti 错误的 IP 地址,因为其他一切都很好。我建议访问终端并使用 ifconfig 命令查找您的 ip 或访问您的网络设置,如果您使用像我这样的 mac 选择网络,高级选项,选择 tcp/ip 选项卡并使用 ipv4 地址作为 ip 地址。如果这不起作用,请尝试使用其他端口或检查本地计算机上的防火墙设置。希望有帮助。

【讨论】:

    【解决方案2】:

    Localhost 是手机本身,而不是您的计算机。如果在模拟器上,localhost 是模拟器,而不是您的计算机 - 模拟器不知道它是模拟器,它有自己的 IP 地址。修复您正在使用的 IP。

    【讨论】:

    • 我已将 localhost 更改为运行服务器的计算机 IP 地址,但仍未到达服务器。请参阅已编辑的问题以获取更新的错误。谢谢
    • 确保您的 WAN 设置为允许到该端口的流量,至少来自网络内部。确保您没有使用蜂窝网络(使用 wifi)。并摆脱那种严格模式的东西 - 像你应该使用的那样使用线程。不要过早养成坏习惯,在主线程上做网络会导致应用要么性能不佳,要么被操作系统杀死。
    • 我检查了端口是否打开并且可以接受连接,当我删除严格模式的东西时应用程序崩溃
    • 我在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1155) 收到此错误 android.os.NetworkOnMainThreadException
    • 就像我说的 - 使用线程。所有网络都应该在一个单独的线程上完成。在主线程上执行此操作会导致应用程序出现冻结。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2020-09-05
    相关资源
    最近更新 更多