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)