岛屿可以找到海
岛屿可以找到海

安卓手机跑go项目(2)

上一次虽然项目成功运行了但是涉及到网络请求服务就报错:

Post "https://api.siliconflow.cn/v1/chat/completions": dial tcp: lookup api.siliconflow.cn on [::1]:53: read udp [::1]:37232->[::1]:53: read: connection refused

dns解析不成功,但是我用Termux在手机里ping这个地址是完全可以的

然后又尝试使用nslookup命令也是完全可以的,问ai也是无果,查百度也是无果,可能这个玩法太野了,我在网上查到很多玩法都是先通gomobile打包成aar库染后通过java调用

终于我在这个文章底下发现了答案

https://www.cnblogs.com/fieldtianye/p/18004482

里面有很关键的一句话“涉及到网络访问走不通,原因是 AOSP android 系统没有 /etc 的网络解析文件。

我又把这句话甩给了ai,ai这下告诉我一个解决方案,go可以自定义dns解析代码如下:

	// 自定义 Resolver
		resolver := &net.Resolver{
			PreferGo: true,
			Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
				d := net.Dialer{
					Timeout: 10 * time.Second,
				}
				return d.DialContext(ctx, "udp", "8.8.8.8:53") // 使用 Google 的 DNS 服务器
			},
		}

		// 自定义 DialContext
		dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) {
			host, port, err := net.SplitHostPort(addr)
			if err != nil {
				return nil, err
			}
			ips, err := resolver.LookupIPAddr(ctx, host)
			if err != nil {
				return nil, err
			}
			if len(ips) == 0 {
				return nil, fmt.Errorf("no IP addresses found for host: %s", host)
			}
			return net.Dial(network, net.JoinHostPort(ips[0].String(), port))
		}
		client := &http.Client{}
		client.Transport = &http.Transport{DialContext: dialContext}
		resp, err := client.Get("http://www.baidu.com")
		if err != nil {
			fmt.Println(err)
		}
		defer resp.Body.Close()
		body, err := io.ReadAll(resp.Body)
		if err != nil {
			fmt.Println(err)
		}
		fmt.Println(string(body))
https://cdn.dykyzdh.cn/wp-content/uploads/2025/03/WechatIMG1358-699x1024.png

成功!!!

岛屿可以找到海

安卓手机跑go项目(2)
上一次虽然项目成功运行了但是涉及到网络请求服务就报错: Post "https://api.siliconflow.cn/v1/chat/completions": dial tcp: lookup api.siliconflow.cn on [::1]:53: read udp…
扫描二维码继续阅读
2025-03-01