#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}
указать параметры