在Android上使用Java进行本机反应中执行dns srv请求

时间:2019-06-28 19:37:32

标签: javascript java android react-native dns

我正尝试通过Android的反应式本机应用程序解析DNS SRV条目。不幸的是,在对npm和google进行了一些研究之后,我找不到合适的库并尝试自己实现本机JAVA实现。不幸的是没有成功。

因此,我遵循Facebook官方指南(https://facebook.github.io/react-native/docs/native-modules-android)来创建本机模块。但是在此之前,我在JAVA上进行了常规测试,取得了成功。示例代码可以在下面找到。

本地Java实现。我已经创建了一个新的Maven项目,其中dnsjava为依赖项(https://github.com/dnsjava/dnsjava/blob/master/EXAMPLES.md

package test.jsc;
import org.xbill.DNS.*;

public class App 
{
    public static void main( String[] args )
    {

        try {
            Record[] records = new Lookup("_2ndlock._tcp.symlink.de", Type.SRV).run();

            if(records != null && records.length > 0) {
                System.out.println(records[0]);
            }
        } catch (TextParseException e) {
            e.printStackTrace();
            System.out.println("no service found");
        }

    }
}

那很完美,并在我的终端上打印了记录。

_2ndlock._tcp.symlink.de.   600 IN  SRV 10 5 443 jarvis.symlink.de.

到目前为止,一切都很好。

然后,我为react-native应用程序创建了本机实现。 也就是说,在我的本机项目文件夹中,是android / app / src / java / com / secondlock / SymlinkDnsSrv.java。该类提供方法“ resolveDnsSrvRecord”来解析dns条目。

package com.secondlock;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import org.xbill.DNS.*;
import com.facebook.react.bridge.Promise;

public class SymlinkDnsSrv extends ReactContextBaseJavaModule {

    public SymlinkDnsSrv(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "SymlinkDnsSrv";
    }

    @ReactMethod
    public void resolveDnsSrvRecord(String domain, Promise promise) {

        try {
            Record[] records = new Lookup(domain, Type.SRV).run();
            promise.resolve(records);

        } catch (Exception e) {
            promise.reject(e);
        }

    }
}

那是我的react-native项目中的包Java类,位于文件夹android / app / src / java / com / secondlock / SymlinkDnsSrvPackage.java

package com.secondlock;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class SymlinkDnsSrvPackage implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext){
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new SymlinkDnsSrv(reactContext));
        return modules;
    }
}

在我的react-native项目中,是否已创建模块加载包装程序(如Facebook建议)来加载本机模块

import {NativeModules} from 'react-native';
export default NativeModules.SymlinkDnsSrv;

并在我的引导程序类中使用实现

private async load(): Promise<void> {
        console.log(SymlinkDnsSrv);
        const r = await SymlinkDnsSrv.resolveDnsSrvRecord("_2ndlock._tcp.symlink.de");

        console.log(r);
    }

然后我在android模拟器(Pixel Api 28,Android 9.0)中运行该应用程序,并始终从调试器获取此输出:

{resolveDnsSrvRecord: ƒ, getConstants: ƒ}getConstants: ƒ ()resolveDnsSrvRecord: ƒ fn()__proto__: Object


Bootstrapper.ts:22 null

无法解析DNS SRV记录。始终返回null。

也许有人在这里给小费,我在做什么错?也许已经实现了?我期待所有帮助,并说谢谢。

+++更新 我在虚拟设备上玩过不同的android版本,结果发现使用android 7一切正常。该问题发生在版本8或更高版本上。

0 个答案:

没有答案
相关问题