Home > OS >  signalr android (kotlin) cannot connect to server because it is always DISCONNECTED
signalr android (kotlin) cannot connect to server because it is always DISCONNECTED

Time:09-08

I use implementation 'com.microsoft.signalr:signalr:6.0.8' for android (kotlin) and backend is .Net 6 but the emulator cannot connect to the server (localhost). I try to code a function to check hubConnection.connectionState, it is DISCONNECTED. no error happened. Can anyone guide me to find the error, here is the code:

import com.microsoft.signalr.Action1
import com.microsoft.signalr.HubConnection
import com.microsoft.signalr.HubConnectionBuilder
import com.microsoft.signalr.HubConnectionState
import io.reactivex.rxjava3.core.Single
import org.slf4j.Logger
import org.slf4j.LoggerFactory


class SignalRListener private constructor(){
    private var hubConnection: HubConnection
    private var logger: Logger

    init {
        logger  = LoggerFactory.getLogger(HubConnection::class.java)
        // define in constructor
        hubConnection = HubConnectionBuilder.create("http://10.0.2.2:5291/hubs/presence")
            .withAccessTokenProvider(Single.defer { Single.just("${Constanst.TOKEN}") })
            .build()

        hubConnection.on("UserIsOnline",
            Action1 { member: Member -> println(member.DisplayName   "online") },
            Member::class.java
        )

        hubConnection.on("UserIsOffline",
            Action1 { username: String -> println(username " offline") },
            String::class.java
        )

        hubConnection.on(
            "GetOnlineUsers",
            Action1 { usersOnline : List<Member> ->
                for (item in usersOnline) {
                    println(item.DisplayName)
                }
            },
            List::class.java
        )
        hubConnection.start().doOnError({ logger.info("Client connected error.") })
    }

    private object Holder { val INSTANCE = SignalRListener() }

    companion object {
        @JvmStatic
        fun getInstance(): SignalRListener{
            return Holder.INSTANCE
        }
    }

    fun stopHubConnection(){
        if(hubConnection.connectionState == HubConnectionState.CONNECTED){
            hubConnection.stop()
        }
    }

    fun getConnectionState(){
        println(hubConnection.connectionState.toString())
    }

    fun log(){
        logger.info("Debug infor siganlR {}", hubConnection.connectionId)
    }
}

Web (React) runs well with the backend.

class MainActivity : AppCompatActivity() {
    lateinit var signalR: SignalRListener;
    var btnCheck: Button? = null
    var btnLog: Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        signalR = SignalRListener.getInstance()

        btnCheck = findViewById(R.id.btnCheck)
        btnCheck?.setOnClickListener {
            signalR.getConnectionState()
        }

        btnLog = findViewById(R.id.btnLog)
        btnLog?.setOnClickListener {
            signalR.log()
        }
    }
}

CodePudding user response:

As you are in the android emulator, You have to access your localhost so that it reaches your server. If you need internet through proxy you can also set it from the Settings and Proxy and there you can define your proxy settings.

enter image description here

CodePudding user response:

There is a problem with the library. I have to use the latest one

implementation 'com.microsoft.signalr:signalr:7.0.0-preview.7.22376.6'

and I upload the api to the hosting, the virtual machine and the real machine work. However, when running the localhost connection, it is not possible to include both real and virtual machines. In this case, the virtual machine may not be able to connect to the localhost app server when use 10.0.2.2

  • Related