【问题标题】:How to write an Android SocketServer to listen on wifi如何编写一个Android SocketServer来监听wifi
【发布时间】:2011-06-30 13:23:15
【问题描述】:

我使用java.net.SocketServer 编写了一个线程来监听特定端口。它在 android 模拟器中运行良好(使用端口转发)。我计划在使用应用程序时通过 wifi 连接到此端口。但是,SocketServer 文档说,如果您不提供 InetAddress,则服务器会在 localhost 上进行侦听。

如果我不提供地址,我将无法通过 wifi 连接,我是否正确?如何让wifi连接的InetAddress传递给SocketServer

【问题讨论】:

    标签: android sockets wifi


    【解决方案1】:

    当你创建一个 ServerSocket 时,你会在 localhost 上监听一个 port。如果您想提名自己的local host address,这取决于您。

    阅读这两篇文章:

    记得拥有WiFi lock 和适当的权限。

    【讨论】:

    • 感谢您的回复 - 我不知道 wifi 锁。我有一个像你建议的页面一样的工作服务器应用程序。令我困惑的是,如果我使用 C 或 Python 之类的语言编写服务器并绑定到 localhost,我只能从 localhost 连接。我不清楚android上的SocketServer是绑定到所有IP地址还是只绑定到本地主机地址。
    • 收听所有 IpAddresses 是耗电和 CPU 的。当然它只监听 localhost(或者你明确指定的 ipaddress)
    • 我想你不明白我所说的绑定到地址是什么意思——绑定到所有地址没有额外的能力!无论如何,SocketServer 似乎绑定到我尝试过的测试手机的 wifi 地址。它不仅仅绑定到 localhost 环回地址。
    • 我的错,我应该改用绑定这个词。
    【解决方案2】:

    你可以试试下面的代码。

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    
    private String getIPAddress() throws SocketException {
    
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo info = connectivityManager.getActiveNetworkInfo();
    
            if (info == null || !info.isConnected()){
                return null;
            }
    
            switch (info.getType()) {
                case ConnectivityManager.TYPE_WIFI: {
                    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                    if (wifi == null) break;
                    WifiInfo wifi_info = wifi.getConnectionInfo();
                    String ipAddress = intToIp(wifi_info.getIpAddress());
                    return ipAddress;
                }
                case ConnectivityManager.TYPE_MOBILE: {
                    Enumeration<NetworkInterface> interfaceEnumerations =  NetworkInterface.getNetworkInterfaces();
                    while(interfaceEnumerations.hasMoreElements()){
                        NetworkInterface interfac = interfaceEnumerations.nextElement();
                        Enumeration<InetAddress> inetAddresses = interfac.getInetAddresses();
                        while(inetAddresses.hasMoreElements()){
                            InetAddress address = inetAddresses.nextElement();
                            if (!address.isLoopbackAddress() && !address.isLinkLocalAddress()) {
                                String addressIp = address.getHostAddress();
                                if(TextUtils.isEmpty(addressIp) || !addressIp.matches("(\\d{1,3}.){3}\\d{1,3}")) continue;
                                return addressIp;
                            }
                        }
                    }
                    break;
                }
            }
    
            return null;
        }
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 2023-04-10
      • 2019-06-14
      • 2012-03-15
      • 2021-12-18
      • 1970-01-01
      • 2014-10-19
      相关资源
      最近更新 更多