【问题标题】:Android client socket unable to connect to serverAndroid客户端套接字无法连接到服务器
【发布时间】:2013-12-05 11:12:37
【问题描述】:

我的本​​地计算机中有一个服务器套接字正在侦听,我正试图从我的 android 手机连接到它。 我已经在同一台计算机上用客户端测试了服务器套接字,他们能够连接。

但是,我的安卓手机客户端无法连接到套接字。 我电脑的防火墙已关闭。我的电脑和手机都连接到同一个wifi网络。有人可以帮忙吗?

以下客户端套接字的代码:

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Thread fst = new Thread(new startConnection());
        fst.start();
    }

 public class startConnection implements Runnable {
        public void run() {
            try {           
                 final InetAddress hostAddr = InetAddress.getByName("192.168.2.1");//This is the local IP of my computer where the serversocket is listening
                        clientSocket = new Socket();
                        clientSocket.bind(null);
                        clientSocket.connect(new InetSocketAddress(hostAddr, 12555),30000);
               } catch (Exception e) {
                        e.printStackTrace();
               } // end TryCatch block 
         }
}

我不断收到的错误是套接字连接超时。帮助?

非常感谢!

【问题讨论】:

  • 你的电脑里有没有像kasperSky这样的杀毒软件?如果是这样,您需要将其关闭,因为它可以防止未经授权的访问。
  • 只是我关闭的防火墙。我有一个 mac,不知道这是否有什么不同
  • 您是否尝试在手机上使用其他客户端(浏览器)连接到服务器?您的服务器收到来自您客户端的请求了吗?
  • 没想到这样做。刚刚尝试从我的手机浏览器连接到 localIP:port 并没有工作。我想这纯粹是一个网络问题。但是我禁用了我的mac防火墙,它们都连接到同一个网络......

标签: java android sockets


【解决方案1】:

发现问题。 我正在使用这段代码来获取服务器的本地 IP:

 try {
    ip = InetAddress.getLocalHost();
 }catch (UnknownHostException e) {
      e.printStackTrace();
 }

这为服务器的本地 IP 提供了类似 192.168.2.1 的内容。然后我用这个地址将客户端连接到服务器,但连接一直没有成功。

我不得不改用一个像 10.0.0.9 这样的数字,然后它就起作用了。 为了获得正确的 IP,我必须使用以下代码:

  Enumeration<NetworkInterface> nis = null;
                try {
                    nis = NetworkInterface.getNetworkInterfaces();
                } catch (SocketException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                NetworkInterface ni;
                while (nis.hasMoreElements()) {
                    ni = nis.nextElement();
                    try {
                        if (!ni.isLoopback() && ni.isUp()) {
                            for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
                                //filter for ipv4/ipv6
                                if (ia.getAddress().getAddress().length == 4) {
                                    //4 for ipv4, 16 for ipv6
                                    System.out.println(ia.getAddress());
                                }
                            }
                        }
                    } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

这给了我: /10.0.0.9 /192.168.2.1

第一个数字是正确的。

有人可以从网络的角度解释一下,这两个数字/获取它们的代码有什么区别以及为什么一个有效?

谢谢!

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2016-06-08
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多