Я пытаюсь настроить веб-сокет с помощью socket.io для получения уведомлений с сервера.
Все отлично работает с настольного клиента. Даже проверено удаленным тестированием. Платная розетка всегда работает. Подтвержденный сокет иногда имеет проблемы.
На мобильном клиенте - конкретно IOS (не пробовал Andriod) ни один из сокетов не работает.
Кроме того, более общий вопрос об архитектуре socket.io:
Это приложение работает при получении оплаты биткойнами.
Каждый раз, когда открывается веб-сайт, выполняется вызов API для получения нового адреса. Сеанс связан с этим адресом с помощью комнаты =, в этом случае на него ссылается 'id'. Затем все последующие сообщения, отправленные через сокет, фильтруются с использованием этого адреса => они в основном являются обновлениями платежей, произведенных по данному адресу.
thewebsite.com является произвольным. мы не используем localhost. это проверенный домен tls.
Любые другие предложения приветствуются и будут оценены.
У меня была точно такая же настройка, но с http-сервером и различными решениями я перешел на https - хотя nginx уже обрабатывал ssl.
СТОРОНА КЛИЕНТА JS
let socket = io();
socket.connect("https://thewebsite.com/");
socket.on('paid', function(msg){
console.log(msg);
const amount_paid = parseFloat(msg.message.amount);
received(amount_paid);
});
socket.on('confirmed', function(msg){
console.log(msg);
const amount_paid = parseFloat(msg.message.amount);
confirmed(amount_paid);
});
...
...
get_address()
.then((result)=>{
address = result;
socket.emit('id', {"address": address});
console.log(address);
})
.catch((e)=>{
console.log(e);
});
...
...
...
SERVER SIDE JS
const express = require('express');
const app = express();
const read = require('fs').readFileSync;
const credentials = {
"key": read(`${process.env.SSL}thewebsite.key`, 'utf8'),
"cert": read(`${process.env.SSL}thewebsite.crt`, 'utf8'),
"ca": [
read(`${process.env.SSL}tan_ca1.pem`, 'utf8'),
read(`${process.env.SSL}tan_ca1.pem`, 'utf8'),
read(`${process.env.SSL}tan_ca1.pem`, 'utf8')
]
};
const server = require('https').createServer(credentials, app);
const io = require('socket.io').listen(server);
...
...
...
app.post('/paid', (req,res)=>{
try{
//console.log(req.body.secret);
let data = req.body;
//the node will call this end point when new transaction is received
if(data.secret === process.env.PIDGEY_SECRET){
delete data.secret;
console.log(data.address);
io.to(`${data.address}`).emit('paid', {status:true, message: data});
res.status(200).send({status: true, message:`pidgey knows about ${data.address}`});
}
else{
res.status(400).send({status: false, message:"not my address"});
}
}
catch(e){
res.status(400).send({status: false, message:"error"});
console.log(`Broke at the outskirts of btc_received.\n\nHere is the full error: ${e}`);
}
});
...
...
...
io.sockets.on('connection',(socket) =>{
console.log("Suser live.")
socket.on('disconnect', function(){
console.log('sUser disconnected.');
});
socket.on('id',function(msg){
socket.join(msg.address);
console.log(msg.address);
});
})
NGINX
server{
listen 443 ssl;
server_name thewebsite.com www.thewebsite.com;
ssl on;
gzip on;
ssl_certificate /etc/nginx/ssl/thewebsite_certchain.crt;
ssl_certificate_key /etc/nginx/ssl/thewebsite.key;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://localhost:3000/;
}
}
Ожидается получение обновлений на IOS. Ничего не получить. Нет обновления при использовании chrome: //inspect.