как использовать android retrofit2 с nodejs сервером? - PullRequest
1 голос
/ 06 марта 2020

Я использую Retrofit2 с nodejs сервером. когда я звоню на сервер узла в android, журнал android показывает. запрос заканчивается мгновенно. результат этого адреса правильный. когда я go по этому адресу, json результат показывается правильно. но в android я не могу связать android клиента с сервером узла. как вы можете видеть, я получаю сообщение об ошибке, хотя я установил тайм-аут на 1 минуту. Я не знаю, почему я не могу общаться с сервером. Кто-нибудь знает это? в nodejs журнал не показывался.

android журнал

D/OkHttp: --> GET http://192.168.0.xx:5000/api/customers
    --> END GET

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.haii.schedulemanager, PID: 8169
    java.net.SocketTimeoutException: failed to connect to /192.168.0.xx (port 5000) from /192.0.0.x (port 39078) after 60000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:185)
        at libcore.io.IoBridge.connect(IoBridge.java:129)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
        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 okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.kt:57)
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:266)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:180)
        at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:238)
        at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:111)
        at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:79)
        at okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:163)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.kt:219)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

манифест

        android:usesCleartextTraffic="true" //this is for http

nodejs

app.get('/api/customers',(req,res)=>{

    let today = moment(new Date()).format("YYYY-MM-DD");
    let date="";

    if(moment().day()===0){
        date = getWeekday(moment(new Date()).add('days',7).format("YYYY-MM-DD"),"Saturday");
    }else{
        date = getWeekday(today,"Saturday");
    }


    let sql = "select * from customer "+
            "where isDeleted=0 and createdDate between '"+today+"' and '"+ date+"'"; 
    const params = ""
    console.log(sql);

    connection.query(
        sql,params,
        (err,rows,fields)=>{
            console.log(rows);
            res.send(rows);
        }
    )
});

ps: когда я запускаю с эмулятором, меняющим URL на http://10.0.2.2:5000/, результат получается правильным. но когда я запускаю это на своем телефоне, он показывает вышеуказанную ошибку.

applicationModule

    @JvmStatic
    @Singleton
    @Provides
    fun provideTaskNetwork() : ScheduleNetwork {
        return Retrofit.Builder()
            .baseUrl("http://192.168.0.xx:5000/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(provideOkhttp())
            .build()
            .create(ScheduleNetwork::class.java)

interface


interface ScheduleNetwork {

    @GET("api/customers")
    fun getCustomers(

    ): Call<CustomerItem>

}

1 Ответ

1 голос
/ 06 марта 2020

В комментарии вы упомянули, что ваш Android не на вашем локальном Wi-Fi, а вы используете сеть передачи данных оператора. Вы не можете сделать это ™. Если вы хотите подключиться к тестовому серверу в вашей локальной сети, ваш Android должен быть подключен к Wi-Fi для той же сети. Если вы хотите подключиться с использованием сети передачи данных вашего Android, ваш сервер должен находиться на общедоступном c сетевом адресе.

В вашем Java traceback это важная строка.

java. net .SocketTimeoutException: не удалось подключиться к /192.168.0.xx (порт 5000) из /192.0.0.x (порт 39078) после 60000 мс

Давайте прочитаем эту строку для деталей.

  1. SocketTimeoutException. Этот код Java отказался после ожидания подключения к серверу.

  2. to /192.168.0.xxx (port 5000) Этот код пытался подключиться к серверу, работающему на компьютере в локальной частной сети 192.168 .0.xxx на порту 5000. Возможно, вы предполагаете, что это ваш nodejs сервер. Мы знаем, что это частная сеть, потому что все адреса 192.168.x.y являются адресами частной сети. Так же как и все адреса 10.x.y.z. Моя и ваша частная сеть могут иметь одинаковые адреса. Таким образом, сеть publi c никогда не пытается обработать трафик c, адресованный этим частным сетям. Он просто игнорирует это.

  3. from /192.0.0.xxx (port 39078) Ваш локальный компьютер, android, попытался установить соединение. Его адрес 192.0.0.xxx в сети вашего оператора. Сеть вашего оператора обнаруживает, что вы пытаетесь подключиться к 192.168.x.y адресу частной сети. Это просто недопустимо в сети publi c, поэтому ваш оператор игнорирует ее.

  4. after 60 000ms Код Java вашего Android через минуту сдался. Тайм-ауты случаются, когда сети игнорируют трафик c.

...