Пытаюсь подключиться к серверу с помощью сокета.Ввод-вывод на Android получает ошибку 400 xhr ошибка опроса

#android #node.js #kotlin #socket.io

Вопрос:

Я получаю сообщение об ошибке, просто пытаясь установить начальное соединение между клиентом Android и моим локальным сервером сокетов, работающим Node.js но продолжайте получать эту ошибку опроса xhr, я пытался решить эту проблему в течение последних нескольких часов, но не очень удачно, любая помощь будет признательна. Я добавил правильные настройки в манифест, а также убедился, что использую частный IP-адрес сервера (локальной машины), я могу просматривать / подключаться к этому порту, я пробовал это как на эмуляторе, так и на физическом устройстве, но получил ту же ошибку.

Подключение Клиента

 @Synchronized
fun setSocket() {
    try {
Log.d("socketHandler", "setting Socket" )
        mSocket = IO.socket("http://192.168.1.156:3000")

        mSocket.on(Socket.EVENT_CONNECT_ERROR){
            Log.d("SocketHandler" ,"Connection Error : ${it}")
            it.forEach { item ->
                val exception = item as EngineIOException
                print(exception.message   " "   exception.code   " "   exception.cause)
            }
        }
        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT){
            Log.d("SocketHandler", "TimeOut Error : $it")
        }
        establishConnection()

    } catch (e: Exception) {
        when(e){
           is  URISyntaxException -> e.printStackTrace()
           is  EngineIOException -> {
               Log.d("EngineException", "${e.code}, ${e.transport}, ${e.message}")
               e.printStackTrace()
           }
            else -> e.printStackTrace()
        }

    }
}
 

Главный фестиваль

 <uses-permission android:name="android.permission.INTERNET"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:usesCleartextTraffic="true"
    android:theme="@style/Theme.AirHockeyCompose">
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.AirHockeyCompose.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
 

Сервер

     const { Server } = require("socket.io");
    
    const io = new Server({ /* options */ });
    
    io.on("connection", (socket) => {
      console.log("connection")
      console.log(socket)
    });

io.listen(3000);
 

Ошибка (это получено в сокете.EVENT_CONNECT_ERROR)

 xhr poll error null java.io.IOException: 400io.socket.engineio.client.EngineIOException: xhr poll error 
 

Ответ №1:

Я не эксперт в этом, но я сделал это некоторое время назад в задании. У меня был сервер nodejs, содержащий несколько изображений, и Android, который подключается к нему через сокет для их отображения.

Соединение шло нормально, у меня не было ошибок, и вы можете проверить их здесь, если это вам все равно поможет https://github.com/aliosman21/Minly-Task .

Что касается ваших приведенных фрагментов, единственное, что я заметил, это то, что IP-адрес сервера на эмуляторах должен быть 10.0.2.2 (если память не изменяет), но поскольку вы уже пробовали это на физическом устройстве, я не уверен.

Я полагаю, что мы оба использовали одну и ту же клиентскую библиотеку https://socketio.github.io/socket.io-client-java/initialization.html

Еще одна вещь, в которой следует убедиться, это то, что если вы используете самозаверяющий сертификат на сервере, вам необходимо {rejectUnauthorized: false} указать параметры