Android应用程序无法连接到socket.io Golang服务器

android应用程序无法连接到socket.io golang服务器

最近,一些Android应用程序无法连接到socket.io Golang服务器的问题引起了广泛关注。php小编新一在此为大家解答。在使用socket.io Golang服务器时,有一些常见的连接问题可能导致Android应用程序无法连接。首先,确保你的Android应用程序和服务器在相同的网络环境下,并且能够互相访问。另外,检查你的代码中是否正确设置了服务器的地址和端口。如果问题仍然存在,可以尝试使用其他网络调试工具来检查连接问题,如Wireshark等。希望这些解答能帮助到你解决问题!

问题内容

我不知道我是否遗漏了一些东西,因为我的 kotlin 代码没有找到 golang 套接字服务器。我做了一个 netstat -ano 并且端口 8000 已经用于 tcp,所以我认为套接字服务器运行良好。但我的安卓还是找不到。服务器和模拟器都在同一网络上。这是我的代码:

//服务器(golang)

import (    "fmt"    "net/http"    socketio "github.com/googollee/go-socket.io"    "github.com/googollee/go-socket.io/engineio"    "github.com/googollee/go-socket.io/engineio/transport"    "github.com/googollee/go-socket.io/engineio/transport/polling"    "github.com/googollee/go-socket.io/engineio/transport/websocket")server := socketio.newserver(&engineio.options{    transports: []transport.transport{        &polling.transport{            checkorigin: alloworiginfunc,        },        &websocket.transport{            checkorigin: alloworiginfunc,        },    },})server.onconnect("/", func(s socketio.conn) error {    s.setcontext("")    fmt.println("connected:", s.id())    return nil})server.onevent("/", "notice", func(s socketio.conn, msg string) {    fmt.println("notice:", msg)    s.emit("reply", "have "+msg)})server.onerror("/", func(s socketio.conn, e error) {    fmt.println("meet error:", e)})server.ondisconnect("/", func(s socketio.conn, reason string) {    fmt.println("closed", reason)})go server.serve()defer server.close()http.handle("/socket.io/", server)http.handle("/", http.fileserver(http.dir("./asset")))fmt.println("scktsrv serving at localhost:8000...")fmt.print(http.listenandserve(":8000", nil))

登录后复制

//android(kotlin)

立即学习“go语言免费学习笔记(深入)”;

implementation ('io.socket:socket.io-client:2.0.0') {    exclude group: 'org.json', module: 'json'}try {    msocket = io.socket("http://localhost:8000/skt")    log.d(tag, "success: ${msocket.id()}")} catch (e: exception) {    e.localizedmessage?.let { log.e(tag, it) }}msocket.connect()msocket.on(socket.event_connect, onconnect)msocket.on("reply", onreply)private var onconnect = emitter.listener {    log.i(tag, "onconnect")    msocket.emit("notice", "{"relay_num": 4, "to_status": 1}")}private var onreply = emitter.listener {    log.i(tag, "replymsg: ${it[0]}")}

登录后复制

更新:

在@dev.bmax的回答之前,我已经发现了一些关于启用cleartexttraffic的信息,并且已经在我的androidmanifest.xml上添加了 android:usescleartexttraffic=”true” ,但该应用程序仍然无法连接到服务器。 socket.connected() 现在返回 false。

另外,您应该如何实际连接到服务器?我只需要 http://10.0.2.2:8000 而不需要任何路径吗?

更新:

我刚刚注意到我不断收到如下所示的日志:

tagsocket(6) with statstag=0xffffffff, statsuid=-1

登录后复制

它不断在 logcat 上弹出

更新:

我四处寻找其他代码,并找到了一个可以工作的代码。幸运或不幸的是,这很简单。这是我找到的代码:

//go语言

listener, _ := net.listen("tcp", ":8000")for {    conn, _ := listener.accept()    fmt.printf("%s --- %s", conn.localaddr(), conn.remoteaddr())    io.writestring(conn, "welcome to socket")}

登录后复制

//android kotlin

val host = "192.168.100.250"val port = 8000executors.newsinglethreadexecutor().execute {    try {        val socket = java.net.socket(host, port)        receivemove(socket)    } catch (e: connectexception) {        log.e(tag, "socket connexc: ${e.localizedmessage}")        runonuithread {            toast.maketext(this, "connection failed", toast.length_short).show()        }    }catch (e: exception) {        log.e(tag, "socket connexc: ${e.localizedmessage}")    }}

登录后复制

现在我想知道,为什么准系统代码可以工作,而 googollee 库提供的代码却不能?我认为我没有错过双方的任何设置。

更新:

取得了一些进展。发现 android 代码可以工作,但由于某种原因正在执行一些意外的问题。以下是我在 android 端所做的更改的详细信息:

// 应用程序 build.gradle

implementation('io.socket:socket.io-client:0.8.3') {    exclude group: 'org.json', module: 'json'}

登录后复制

//mainactivity.kt

import io.socket.client.ioimport io.socket.client.socketinit {    try {        msocket = io.socket("http://:8000/socket.io/")    }catch (e: connectexception) {        log.e(tag, "socket connexc: ${e.localizedmessage}")    }catch (e: urisyntaxexception) {        log.e(tag, "socket urisynexc: ${e.localizedmessage}")    }catch (e: exception){        log.e(tag, "socket exc: ${e.localizedmessage}")    }}

登录后复制

// androidmanifest.xml

android:usesCleartextTraffic="true"//I used to have android:networkSecurityConfig="@xml/network_security_config" here as well

登录后复制

完成这些更改后,应用程序现在可以连接到服务器。但连接后,应用程序似乎立即断开连接。然后它再次连接到服务器,然后再次断开连接,然后连接到服务器,这个循环似乎没有停止。我在断开连接时收到 lated 客户端命名空间dis​​connect。

解决方法

我终于找到了使这项工作发挥作用的部分。我认为最大的问题是在android方面。更换要使用的库似乎已经解决了所有问题,然后只需进行一个小的更改即可解决立即断开连接的问题。以下是双方的最终代码和其他详细信息:

//go语言

package mainimport (    "fmt"    "net/http"    socketio "github.com/googollee/go-socket.io"    "github.com/googollee/go-socket.io/engineio"    "github.com/googollee/go-socket.io/engineio/transport"    "github.com/googollee/go-socket.io/engineio/transport/polling"    "github.com/googollee/go-socket.io/engineio/transport/websocket")var alloworiginfunc = func(r *http.request) bool {    return true}func main() {    server := socketio.newserver(&engineio.options{        transports: []transport.transport{            &polling.transport{                checkorigin: alloworiginfunc,            },            &websocket.transport{                checkorigin: alloworiginfunc,            },        },    })    server.onconnect("/", func(s socketio.conn) error {        s.setcontext("")        fmt.println("connected:", s.id())        return nil    })    server.onevent("/", "notice", func(s socketio.conn, msg string) {        fmt.println("notice:", msg)        s.emit("reply", "have "+msg)    })    server.onerror("/", func(s socketio.conn, e error) {        fmt.println("error:", e)    })    server.ondisconnect("/", func(s socketio.conn, reason string) {        fmt.println("closed", reason)    })    go server.serve()    defer server.close()    http.handle("/socket.io/", server)    http.handle("/", http.fileserver(http.dir("./asset")))    fmt.println("socket server serving at localhost:8000...")    fmt.print(http.listenandserve(":8000", nil))}

登录后复制

// 安卓 kotlin

androidmanifest.xml


登录后复制

应用程序构建.gradle

implementation('io.socket:socket.io-client:0.8.3') {        exclude group: 'org.json', module: 'json'    }

登录后复制

// mainactivity.kt 或任何您想放置此内容的地方

import io.socket.client.IOimport io.socket.client.Socketclass MainActivity : AppCompatActivity() {    private lateinit var mSocket: Socket    ...        init {        try {            mSocket = IO.socket("http://:8000/")        }catch (e: ConnectException) {            Log.e(TAG, "Socket ConnExc: ${e.localizedMessage}")        }catch (e: URISyntaxException) {            Log.e(TAG, "Socket URISynExc: ${e.localizedMessage}")        }catch (e: Exception){            Log.e(TAG, "Socket Exc: ${e.localizedMessage}")        }    }        override fun onCreate(savedInstanceState: Bundle?) {        ...        mSocket.connect()                binding.btnSend.setOnClickListener {            Log.i(TAG, "isConnected: ${mSocket.connected()}")            mSocket.emit("notice", "from_app_msg")        }    }        override fun onDestroy() {        super.onDestroy()        mSocket.off()        mSocket.disconnect()    }}

登录后复制

关于立即断开,看起来你在android端尝试连接时并不需要添加/socket.io。删除它解决了断开连接的问题。而且您的项目中不需要 asset 文件夹。伙计,这个 socket.io 东西很奇怪。

以上就是Android应用程序无法连接到socket.io Golang服务器的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2485129.html

(0)
上一篇 2025年3月4日 21:42:10
下一篇 2025年3月4日 21:42:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vscode配置go语言开发环境

    golang 环境配置 1) 首先下载适合你系统的安装包 2)下载完成安装到指定目录即可。我这里是(D:Go)。 3)配置Glang环境变量 进入我的电脑->高级设置->环境变量查看下,GOROOT变量是否存在,以及Path变量…

    2025年4月2日 编程技术
    100
  • centos postgresql资源监控

    centos系统下postgresql数据库资源监控方案详解 本文介绍多种监控CentOS系统上PostgreSQL数据库资源的方法,助您及时发现并解决潜在性能问题。 一、利用PostgreSQL内置工具和视图 PostgreSQL自带丰富…

    编程技术 2025年4月2日
    100
  • Debian系统如何集成Golang日志管理工具

    在debian系统上集成go语言日志管理工具,步骤如下: 一、安装Go语言环境 首先,确保你的Debian系统已安装Go。若未安装,执行以下命令: sudo apt updatesudo apt install golang-go 登录后复…

    2025年4月2日
    100
  • Debian中PostgreSQL扩展插件

    在Debian系统中高效管理PostgreSQL扩展插件,您可以选择多种方法。本文重点介绍一种便捷的工具和常用的管理命令。 推荐工具:Pig Pig是一个基于Go语言开发的PostgreSQL包管理器,兼容Debian、Ubuntu等主流L…

    2025年4月2日
    100
  • Debian Golang日志存储在哪里

    Go语言日志的存储位置取决于你选择的日志记录方法。本文将介绍几种常见的日志记录方式,并提供相应的示例代码。 一、标准库日志记录 Go标准库提供基础的日志功能,可将日志输出到控制台或文件。以下代码演示如何将日志写入文件: package ma…

    2025年4月2日
    100
  • maka在电脑上怎么更改?

    maka在电脑上如何更改?想必这是很多用户都想知道的问题。本篇文章php小编苹果就来给大家详细介绍maka在电脑上更改的方法,希望对大家有所帮助,请继续阅读下文。 一、maka在电脑上怎么更改? 打开MAKA作品后,点击右上角,会弹出新窗口…

    2025年4月1日
    000
  • 海通证券电脑版下载网址?

    海通证券电脑版下载在哪?不少股民朋友在炒股时都会用到海通证券,近期不少朋友咨询海通证券电脑版下载地址,php小编子墨为您解答这个问题,下面来看下详细内容吧! 一、海通证券电脑版下载网址? 不确定。因为我不是海通证券公司的员工,没有绝对的信息…

    2025年4月1日
    000
  • 鹅鸭杀手游测试资格怎么获得-荒鹅鸭杀手游内测资格获取方法

    鹅鸭杀手游是一款社交推理派对游戏,游戏即将开启国服测试,那么大家知道游戏的测试资格是怎么获得呢?下面快跟随多小编一起来了解一下鹅鸭杀手游内测资格获取方法吧。 鹅鸭杀手游测试资格获取 招募问卷 点击填写招募问卷并成功提交,即有机会获得测试体验…

    2025年4月1日
    000
  • 如何查看Debian上的Golang日志

    本文介绍几种在Debian系统上查看Go语言应用日志的方法: 方法一:利用journalctl命令 如果你的Go应用以systemd服务的形式运行,可以使用journalctl命令查看其日志。 假设你的服务名为my-go-app,则使用以下…

    2025年4月1日
    000
  • Golang日志如何高效分析

    高效处理Go语言日志,关键在于优化读取、解析和处理流程。以下策略能显著提升性能: 一、优化日志读取: 采用bufio包的缓冲读取方式,避免一次性加载所有数据到内存,显著提升大文件读取速度。合理设置缓冲区大小至关重要。 二、并发处理: 立即学…

    2025年4月1日
    300

发表回复

登录后才能评论