#android #nginx #websocket #socket.io
#Android #nginx #веб- сокет #socket.io
Вопрос:
Здравствуйте, я пытаюсь подключить android к моему сокету.ввод-вывод на мой сервер nodejs, который размещен с использованием ngnix
это мой код для Android, который я использовал в своем приложении для Android
private var mSocket: Socket? = null
val opts = IO.Options()
opts.forceNew = true
opts.reconnection = true
val aara = arrayOf("websocket")
opts.transports = aara
try {
mSocket = IO.socket(socket_url, opts)
mSocket?.connect()
mSocket?.emit("connection", "Nickname");
mSocket?.emit("user_connect", "Nickname");
Log.e("mSocket: ", mSocket?.connected().toString())
mSocket?.on("connection") {
Log.e("onCreate4w: ", "${it::class.simpleName} ${it.size}")
Log.e("mSocket: ", mSocket?.connected().toString())
}
} catch (e: URISyntaxException) {
Log.e("onCreate25: ", mSocket?.connected().toString())
}
а серверный код — это тот, который написан в Nodejs
const io = soketio(server, {
cors: {
origin: [
process.env.TYPEFORM_ORIGIN,
process.env.ADMINPANEL_ORIGIN,
"http://localhost:4200",
"*"
,
],
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true,
},
multiplex: false,
});
io.on("connection", (soket) => {
soket.on("user_connect", (userId) => {
// console.log("USER1", user);
user[userId] = soket.id;
// console.log("USER2", user);
console.log("User Connected", soket.id);
});
и это конфигурация ngnix, которая включена на сервере
location {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:5555;
}
Пожалуйста, укажите нам, где мы ошибаемся
, эта настройка отлично работает с веб-панелью, а не в Android
Ответ №1:
Сначала mSocket?.connect()
не возвращайте подключенный сокет, и вы не сможете немедленно отправить сообщение. Во-вторых, вам нужно подписаться на разные состояния сокета для обработки ошибок
mSocket!!.on(io.socket.client.Socket.EVENT_CONNECT) {
Log.d(TAG, "connected") // emit is possible
}.on("connection") {
Log.e("onCreate4w: ", "${it::class.simpleName} ${it.size}")
Log.e("mSocket: ", mSocket?.connected().toString())
}.on(io.socket.client.Socket.EVENT_CONNECT_ERROR) {
it?.forEach { out ->
Log.w("EVENT_CONNECT_ERROR", out.toString())
}
}.on(io.socket.client.Socket.EVENT_CONNECT_TIMEOUT) {
it?.forEach { out ->
Log.w("EVENT_CONNECT_TIMEOUT", out.toString())
}
}.on(io.socket.client.Socket.EVENT_RECONNECT_ERROR) {
it?.forEach { out ->
Log.w("EVENT_RECONNECT_ERROR", out.toString())
}
}.on(io.socket.client.Socket.EVENT_RECONNECT_FAILED) {
it?.forEach { out ->
Log.w("EVENT_RECONNECT_FAILED", out.toString())
}
}.on(io.socket.client.Socket.EVENT_CONNECTING) {
it?.forEach { out ->
Log.d("EVENT_CONNECTING", out.toString())
}
}
mSocket!!.connect()
Комментарии:
1. Здравствуйте, Станислав. Спасибо за ваш ответ, но этот подход также не работает
2. @AmitKumar Logcat не показывает никаких журналов?
3. Я не думаю, что это проблема Android, это скорее проблема с узлом, потому что то же самое происходит в части Ios
4. @AmitKumar Попробуйте использовать значения по умолчанию и удалите
opts.transports
переопределение5. Здравствуйте, Станислав, Спасибо за ваше драгоценное время. Ваш код помогает нам устранить фактическую проблему, из-за которой сокет не подключался. Существует проблема с управлением версиями на стороне узла. Сейчас мы используем версию 2.3.0 в нашем бэкэнде, теперь мой код работает нормально