Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在活动中获取IP会导致崩溃_Java_Android_Sockets_Tcp_Tcpclient - Fatal编程技术网

Java 在活动中获取IP会导致崩溃

Java 在活动中获取IP会导致崩溃,java,android,sockets,tcp,tcpclient,Java,Android,Sockets,Tcp,Tcpclient,我正在创建一个android应用程序,通过wifi将套接字数据包链接并传输到服务器。为此,必须定义所连接服务器的IP地址。我使用下面的函数来获取IP地址。当我硬编码服务器时\u IP=“0”;应用程序运行正常。请帮忙 private final String SERVER_IP = getIpAddr(); public String getIpAddr() { WifiManager wifiManager = (WifiManager) getApplication

我正在创建一个android应用程序,通过wifi将套接字数据包链接并传输到服务器。为此,必须定义所连接服务器的IP地址。我使用下面的函数来获取IP地址。当我硬编码服务器时\u IP=“0”;应用程序运行正常。请帮忙

    private final String SERVER_IP = getIpAddr();

    public String getIpAddr() {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ip = wifiInfo.getIpAddress();

    String ipString = String.format(
            "%d.%d.%d.%d",
            (ip & 0xff),
            (ip >> 8 & 0xff),
            (ip >> 16 & 0xff),
            (ip >> 24 & 0xff));

    return ipString;
}
设置完上面的代码后,我在OnCreate函数上运行了下面的代码

class ClientThread implements Runnable {

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddr, SERVERPORT);
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}
一旦发生这种情况,我的android应用程序将停止工作

这是出现的错误:


Java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.Context android.content.Context.getApplicationContext()”

以下是一些您必须检查的事项

  • 应用程序是否具有访问WiFi的权限
  • 如果在其他类中使用getApplicationContext(),请从父活动传递上下文
  • 在移动设备上测试,而不是在模拟器上

使用此功能在活动中获取IP(v4或v6):

// Get IP address from first non-localhost interface
// @param ipv4  true returns ipv4
//              false returns ipv6
// @return address or empty string
public static String getLocalIpAddress(boolean useIPv4) {
    try {
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface intf : interfaces) {
            List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLoopbackAddress()) {
                    String sAddr = addr.getHostAddress();
                    //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
                    boolean isIPv4 = sAddr.indexOf(':')<0;
                    if (useIPv4) {
                        if (isIPv4)
                            return sAddr;
                    } else {
                        if (!isIPv4) {
                            int delim = sAddr.indexOf('%'); // drop ip6 zone suffix
                            return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
                        }
                    }
                }
            }
        }
    } catch (Exception ex) { } // for now eat exceptions
    return "";
}
//从第一个非本地主机接口获取IP地址
//@param ipv4 true返回ipv4
//假返回ipv6
//@返回地址或空字符串
公共静态字符串getLocalIpAddress(布尔值useIPv4){
试一试{
List interfaces=Collections.List(NetworkInterface.getNetworkInterfaces());
用于(网络接口intf:接口){
List addrs=Collections.List(intf.getInetAddresses());
用于(InetAddress地址:地址){
如果(!addr.isLoopbackAddress()){
字符串sAddr=addr.getHostAddress();
//布尔isIPv4=InetAddressUtils.isIPv4Address(SADD);

boolean isIPv4=sAddr.indexOf(“:”)尝试使用ActivityName.this.getApplicationContext()获取上下文谢谢你。加上1。太棒了!我再也不会收到错误了!谢谢谢谢你Marcus,继续。socket=new socket(serverAddr,SERVERPORT);只是想知道,我是否使用此功能正确连接到我的服务器?我的serverAddr将是我用来连接android手机和硬件的wifi的ip地址。我想你是对的。“真实的”只有在常规数据连接(如3G、4G等)后,才会显示您手机的IP。谢谢您的回复!我明白了,所以看起来我的TCP客户端设置是正确的。但是,我当前的服务器连接失败可能是由于我的硬件未正确设置套接字服务器。我将对此进行调查!非常感谢!:)我是一名新手所有这些