无法从Android上的Kotlin连接插座
我正在尝试编写一个应用程序,该应用程序可以无线控制一个小型机器人。机器人具有覆盆子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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论