【问题标题】:Android Socket connection refusedAndroid Socket 连接被拒绝
【发布时间】:2011-01-26 09:57:35
【问题描述】:

我正在尝试在 Android 上打开一个 Socket,但无论我尝试哪种方式,每次尝试时都会收到连接被拒绝错误。

错误发生在我尝试创建连接的以下代码行中。


Socket socket = new Socket(getLocalIpAddressString(), 8008);

以下是我获取本地ip地址的方法:


public static String getLocalIpAddressString() {
 try {
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
         NetworkInterface intf = en.nextElement();
         for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
             InetAddress inetAddress = enumIpAddr.nextElement();
             if (!inetAddress.isLoopbackAddress()) {
                 return inetAddress.getHostAddress().toString();
             }
         }
     }
 } catch (SocketException ex) {
     Log.e("IPADDRESS", ex.toString());
 }
 return null;

}


我得到的错误是:


WARN/System.err(3574): java.net.ConnectException: /192.168.2.163:8008 - Connection refused
WARN/System.err(3574):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:237)
WARN/System.err(3574):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:199)
WARN/System.err(3574):     at java.net.Socket.startupSocket(Socket.java:734)
WARN/System.err(3574):     at java.net.Socket.<init>(Socket.java:157)
WARN/System.err(3574):     at com.networks.phone.engine.SIPEngine.rtpTest(SIPEngine.java:1444)

我认为我的 Ipaddress 和/或端口有错误?但是谁能指出我正确的方向可能是什么原因?

【问题讨论】:

  • 你能不能先telnet到地址和端口号看看会发生什么。它也可能是您正在连接的实际计算机。
  • 我正在实际的 Android 设备上尝试这个,所以我不确定 telnet 会有多大帮助?
  • 这可能是个愚蠢的问题,但您设备上的 8008 端口是否有监听?
  • 无论我尝试什么端口,我都会拒绝连接 :)
  • 对,我想我的意思是如果没有其他程序在端口 8008 上侦听,那么您将无法连接。您是否尝试接受传入请求或连接到另一个程序?

标签: java android sockets ip-address


【解决方案1】:

根据您的代码,我假设您正在尝试打开从 Android 应用到同一 Android 设备的套接字连接。

基于 Linux 和所有系统,也许 Android 有某种防火墙或连接规则会阻止您的套接字成功连接。查看文档,可能是Android配置问题,而不是Java问题。

【讨论】:

  • 也许,连接到另一台设备可能是一个更好的主意?
【解决方案2】:

就我而言,我需要重定向端口,看看:

http://developer.android.com/guide/developing/tools/emulator.html#redirections

或者你也可以尝试转发端口。

【讨论】:

    【解决方案3】:

    在其清单中声明网​​络权限的正确编码的 android 应用程序可以接受非特权端口上的连接,因为设备上没有防火墙。

    但是,许多 wifi 和大多数移动网络会将设备置于 NAT 和外部防火墙之后,因此入站连接尝试可能永远无法到达。

    【讨论】:

      【解决方案4】:

      我在提示符中使用了 ipconfig 命令,然后我使用“IPv4 地址”连接到当前 PC。

      我已成功连接服务器以及发送和接收字节。

      Android 客户端代码:

      s = new Socket("192.168.42.85",12345);
      

      PC 服务器端代码:

      socket = ss.accept();
      InetAddress ia = socket.getInetAddress();
      System.out.println("Client Address: " + ia.getHostAddress());
      

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。我不得不使用 ServerSocket 而不是 Socket:

        ServerSocket socket = new ServerSocker(8888);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-08
          • 2018-03-10
          • 2017-11-30
          相关资源
          最近更新 更多