无法从Android上的Kotlin连接插座

发布于 2025-01-18 10:42:09 字数 8470 浏览 1 评论 0原文

我正在尝试编写一个应用程序,该应用程序可以无线控制一个小型机器人。机器人具有覆盆子PI,可以通过简单的Python脚本接收套接字连接(请参见下文)。我用另一台PC对其进行了测试,当我通过插座发送某些内容时,它可以很好地工作。现在,我试图使该应用创建一个套接字,以便它可以与RASPI交谈。我必须允许它在主线程中使用网络,并且还允许在android_manifest.xml中使用Internet。尽管如此,当我在Android Studio的Android模拟器上运行Kotlin-App时,需要一段时间才能完成该连接的时间。如果我在物理设备(我的手机)上启动该应用程序,则输出连接拒绝的异常。 LogCat的完整错误输出在下面。

另外,如果我运行python-script,该脚本通过手机上的插座传输数据,则将收到数据。因此,问题也不是在我的手机的连接中。

我发现有关此问题的所有其他问题解决了他们的问题,因为这是模拟器的问题。这里显然不是这样。

另一个补充: 当我在手机上运行应用程序时,并且要接收的Python脚本正在RASPI上运行,我立即遇到错误。如果要侦听的Python脚本不运行,则需要30秒钟才能获得错误。

用于接收的Python代码:

import socket
IP="0.0.0.0"
Port=9999
sock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((IP,Port))
while True:
    data, addr=sock.recvfrom(512)
    print(data)

我的应用程序的Kotlin代码:

package com.mwsoft.oculus_controller

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.StrictMode
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import java.io.File
import java.io.InputStream
import java.io.OutputStream
import java.net.Socket
import java.nio.charset.Charset
import java.util.*
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val police:StrictMode.ThreadPolicy= StrictMode.ThreadPolicy.Builder().permitAll().build()
        StrictMode.setThreadPolicy(police)
        println("make socket now")
        val transmitter: Client = Client("192.168.1.14", 9999)
        println("Made socket")
        transmitter.send("Hello World")
    }
}
class Client(address: String, port: Int) {

    private val connection: Socket = Socket(address, port)
    private val writer: OutputStream = connection.getOutputStream()

    
    fun send(value:String){
        writer.write(value.toByteArray(Charset.defaultCharset()))
    }
}

在这里,测试的LogCat输出在我的手机上运行:

2022-04-01 15:08:34.051 11460-11460/com.mwsoft.oculus_controller I/System.out: make socket now
2022-04-01 15:08:34.066 11460-11460/com.mwsoft.oculus_controller D/AndroidRuntime: Shutting down VM
2022-04-01 15:08:34.072 11460-11460/com.mwsoft.oculus_controller E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mwsoft.oculus_controller, PID: 11460
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mwsoft.oculus_controller/com.mwsoft.oculus_controller.MainActivity}: java.net.ConnectException: failed to connect to /192.168.1.14 (port 9999) from /:: (port 60202): connect failed: ECONNREFUSED (Connection refused)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4031)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.app.ActivityThread.main(ActivityThread.java:8633)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
     Caused by: java.net.ConnectException: failed to connect to /192.168.1.14 (port 9999) from /:: (port 60202): connect failed: ECONNREFUSED (Connection refused)
        at libcore.io.IoBridge.connect(IoBridge.java:188)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at java.net.Socket.connect(Socket.java:570)
        at java.net.Socket.<init>(Socket.java:450)
        at java.net.Socket.<init>(Socket.java:218)
        at com.mwsoft.oculus_controller.Client.<init>(MainActivity.kt:47)
        at com.mwsoft.oculus_controller.MainActivity.onCreate(MainActivity.kt:31)
        at android.app.Activity.performCreate(Activity.java:8282)
        at android.app.Activity.performCreate(Activity.java:8262)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8633) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133) 
     Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
        at libcore.io.Linux.connect(Native Method)
        at libcore.io.ForwardingOs.connect(ForwardingOs.java:204)
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:157)
        at libcore.io.ForwardingOs.connect(ForwardingOs.java:204)
        at libcore.io.IoBridge.connectErrno(IoBridge.java:202)
        at libcore.io.IoBridge.connect(IoBridge.java:180)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142) 
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390) 
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) 
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) 
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) 
        at java.net.Socket.connect(Socket.java:621) 
        at java.net.Socket.connect(Socket.java:570) 
        at java.net.Socket.<init>(Socket.java:450) 
        at java.net.Socket.<init>(Socket.java:218) 
        at com.mwsoft.oculus_controller.Client.<init>(MainActivity.kt:47) 
        at com.mwsoft.oculus_controller.MainActivity.onCreate(MainActivity.kt:31) 
        at android.app.Activity.performCreate(Activity.java:8282) 
        at android.app.Activity.performCreate(Activity.java:8262) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8633)

I am trying to write an app, which controls a small robot wirelessly. The robot has an Raspberry Pi which can receive Socket connections via a simple python script (see below). I tested it with another PC, when I send something to it via a socket, it works perfectly. Now, I tried to make the app create a socket, so that it can talk to the Raspi. I had to permit it to use network in the main thread, and I also permitted the use of internet in Android_Manifest.xml. Still, when I run my kotlin-app on the android emulator of android studio, it takes a while until the system says, the connection timed out. If I launch the App on a physical Device (my Phone) it outputs a Connection Refused Exception. The full Error output from logcat is below.

Also, if I run the python-script which transmits data via a socket on my phone, the data gets received. So the problem is not in the connection of my phone either.

All other questions that i found regarding this issue fixed their problem because it was a problem with the emulator. This is obviously not the case here.

Another addition:
When I run my app on my phone, and the python script for receiving is running on the Raspi, I immediatly get the Error. If the python script for listening is NOT running, it takes around 30 seconds until I get the error.

Python Code for receiving:

import socket
IP="0.0.0.0"
Port=9999
sock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((IP,Port))
while True:
    data, addr=sock.recvfrom(512)
    print(data)

My kotlin code for the app:

package com.mwsoft.oculus_controller

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.StrictMode
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import java.io.File
import java.io.InputStream
import java.io.OutputStream
import java.net.Socket
import java.nio.charset.Charset
import java.util.*
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val police:StrictMode.ThreadPolicy= StrictMode.ThreadPolicy.Builder().permitAll().build()
        StrictMode.setThreadPolicy(police)
        println("make socket now")
        val transmitter: Client = Client("192.168.1.14", 9999)
        println("Made socket")
        transmitter.send("Hello World")
    }
}
class Client(address: String, port: Int) {

    private val connection: Socket = Socket(address, port)
    private val writer: OutputStream = connection.getOutputStream()

    
    fun send(value:String){
        writer.write(value.toByteArray(Charset.defaultCharset()))
    }
}

And here the logcat output of the test run on my phone:

2022-04-01 15:08:34.051 11460-11460/com.mwsoft.oculus_controller I/System.out: make socket now
2022-04-01 15:08:34.066 11460-11460/com.mwsoft.oculus_controller D/AndroidRuntime: Shutting down VM
2022-04-01 15:08:34.072 11460-11460/com.mwsoft.oculus_controller E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mwsoft.oculus_controller, PID: 11460
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mwsoft.oculus_controller/com.mwsoft.oculus_controller.MainActivity}: java.net.ConnectException: failed to connect to /192.168.1.14 (port 9999) from /:: (port 60202): connect failed: ECONNREFUSED (Connection refused)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4031)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.app.ActivityThread.main(ActivityThread.java:8633)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
     Caused by: java.net.ConnectException: failed to connect to /192.168.1.14 (port 9999) from /:: (port 60202): connect failed: ECONNREFUSED (Connection refused)
        at libcore.io.IoBridge.connect(IoBridge.java:188)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at java.net.Socket.connect(Socket.java:570)
        at java.net.Socket.<init>(Socket.java:450)
        at java.net.Socket.<init>(Socket.java:218)
        at com.mwsoft.oculus_controller.Client.<init>(MainActivity.kt:47)
        at com.mwsoft.oculus_controller.MainActivity.onCreate(MainActivity.kt:31)
        at android.app.Activity.performCreate(Activity.java:8282)
        at android.app.Activity.performCreate(Activity.java:8262)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8633) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133) 
     Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
        at libcore.io.Linux.connect(Native Method)
        at libcore.io.ForwardingOs.connect(ForwardingOs.java:204)
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:157)
        at libcore.io.ForwardingOs.connect(ForwardingOs.java:204)
        at libcore.io.IoBridge.connectErrno(IoBridge.java:202)
        at libcore.io.IoBridge.connect(IoBridge.java:180)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142) 
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390) 
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) 
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) 
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) 
        at java.net.Socket.connect(Socket.java:621) 
        at java.net.Socket.connect(Socket.java:570) 
        at java.net.Socket.<init>(Socket.java:450) 
        at java.net.Socket.<init>(Socket.java:218) 
        at com.mwsoft.oculus_controller.Client.<init>(MainActivity.kt:47) 
        at com.mwsoft.oculus_controller.MainActivity.onCreate(MainActivity.kt:31) 
        at android.app.Activity.performCreate(Activity.java:8282) 
        at android.app.Activity.performCreate(Activity.java:8262) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4197) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2434) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8633)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文