1

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)
ductTapeIsMagic
  • 113
  • 1
  • 8
  • Does this answer your question? [connect failed: ECONNREFUSED](https://stackoverflow.com/questions/18341652/connect-failed-econnrefused) – a_local_nobody Apr 01 '22 at 13:37
  • Unfortunately, it doesn't. The solution in your post just changes the IP-address, so the right target gets found. I just checked my IP again, but it works flawlessly, if the sending socket is from a python script. So the IP is right. – ductTapeIsMagic Apr 01 '22 at 13:43
  • that's unfortunate, i was hoping it would help. assuming that your question is valid and not just a duplicate, this seems to be a very well-asked question, hope you get an answer soon – a_local_nobody Apr 01 '22 at 14:06
  • `I had to permit it to use network in the main thread, ` Pretty bad. Dont do such nasty things. Write a decent app. Put your network code in a thread like everybody does. – blackapps Apr 01 '22 at 15:52
  • I'll do that after I get the rest of the app working – ductTapeIsMagic Apr 01 '22 at 16:11
  • I believe you create an UDP socket on Python side and then you try to connect using TCP. – broot Apr 01 '22 at 19:10
  • So python creates a UDP socket by default and kotlin a TCP socket? – ductTapeIsMagic Apr 01 '22 at 19:25
  • No, both of them use TCP by default, but in your Python code you asked specifically for UDP. `SOCK_DGRAM` means UDP. – broot Apr 01 '22 at 19:47
  • Thank you very much, this was the problem. It works perfectly now. – ductTapeIsMagic Apr 01 '22 at 20:31

0 Answers0