在iOS上一切正常,但在Android上却无法连接 这是我的代码

import { useState, useEffect } from 'react'
import { io } from 'socket.io-client'
const URL = 'http://localhost:8001'
const socket = io(URL)

const useSocket = () => {
  const [isConnected, setIsConnected] = useState(socket.connected)

  useEffect(() => {
    const onConnect = () => setIsConnected(true)
    const onDisconnect = () => setIsConnected(false)
    if (!socket.connected) {
      socket.connect()
    }
    socket.on('connect', onConnect)
    socket.on('disconnect', onDisconnect)

    return () => {
      socket.off('connect', onConnect)
      socket.off('disconnect', onDisconnect)
    }
  }, [])

  return { socket, isConnected }
}

export default useSocket

UPDATE:
It works if i replace
const URL = 'http://localhost:8001'
with
const URL = 'http://192.168.1.91:8001'
which is my local IP on the network

我将把这个问题留下来,因为能够只使用localhost127.0.0.1而不是特定的IP是非常有用的

推荐答案

尽管这是一种不同类型的请求,但它背后的解决方案和推理与这个问题相同:React Native Android Fetch failing on connection to local API

它在iOS SIM上运行,因为作为模拟器,它与主机共享其网络配置.另一方面,Android模拟器是一个独立的设备,有自己的本地IP,所以localhost会告诉你的应用程序搜索Android的内部网络.

您使用主机的完整本地IP地址的解决方案是解决此问题的最简单方法.

出于开发目的,您还可以在构建时使用shell 脚本将主机的IP存储在环境变量中.然后,您可以使用类似react-native-config的工具来读取应用程序中的变量.如果你想了解更多的信息,请让我知道.

Android相关问答推荐

Jetpack Compose Scaffold—content不在TopAppBar下面开始'

理解修饰符<;方法>;与修饰符<;方法>;:效果和行为解释(Android开发者Jetpack Compose)

如何处理穿戴构图上的长点击事件?

在卡片上创建圆角底部边框

保护所有程序包文件和类

如何从LazyColumn中的图标异步获取可绘制的加载?

当按下通知时,将Android应用程序置于前台

有没有什么方法可以让Beeware在安卓手机上显示图片?

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

如何在另一个函数中初始化主类参数? (我是初学者)代码推荐

当父布局的背景为浅色时,Android ProgressBar 背景 colored颜色 变为灰色

如何绘制内边框?

来自位图的 WearOS 图标不显示 colored颜色

组成不重叠的元素

Jetpack compose 为网络检索视频帧导致延迟

如何在 Jetpack Compose 中的 VisualTransformation 之后将光标保持在文本字段的末尾

清洁架构中的服务

java.lang.IllegalArgumentException:与请求匹配的导航目的地 NavDeepLinkRequest

Kotlin Coroutines 会取代 AsyncTask 吗?

如何将设备屏幕位置转换为发送事件位置?