如何在生产中将 socketio 与 cordova 混合应用程序一起使用?
How to use socketio with cordova hybrid app in production?
我之前在移动商店(Google 和 Apple)构建并发布了非常简单的 AjAX/PHP 混合应用程序。现在我正在用 socketio 学习 nodejs。我正在使用 socketio 进行 bidirectional 通信(服务器到客户端和客户端到服务器)。我能够在指向本地主机的开发机器上很好地使用它。
问题是:应用程序部署到移动商店后,服务器应该如何与客户端通信?
在开发机器上很容易做到,因为它是本地的。在开发中,服务器和应用程序都在本地主机上。服务器在端口 3000 上,客户端应用程序 运行 在端口 8000 上。
商店中发布的应用无法“指向”。
这是我的简单应用程序,在所有设备和浏览器上进行本地测试时运行良好。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/app.css">
<title>Myapp</title>
</head>
<body id="app" onload="onLoad()"></body>
</html>
<!--SCRIPTS-->
<script src="cordova.js"></script>
//point to localhost server
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script src="js/app.js"></script>
app.js
// Wait for device API libraries to load
//
function onLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
// device APIs are available
//
function onDeviceReady() {
//testing socket server
serverTest();
}
//testing socketio server
//see socket.js
//
function serverTest() {
var socket = io.connect('http://localhost:3000');
socket.on('connect', function() {
socket.on('text', function(text) {
//display data on page
document.getElementById('app').innerHTML = text;
});
})
}
socket.js
const path = require('path');
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server, {
cors: {
origin: "http://localhost:8000",
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true
}
});
/**
*
* use the following code to serve images, CSS files, and JavaScript files in a directory
* https://expressjs.com/en/starter/static-files.html
*
*/
app.use(express.static('js'));
app.use(express.static('css'));
//get
app.get('/', (req, res,next) => {
//...
});
io.on('connection', (socket) => {
//console
console.log('user connected');
//emitting event
socket.emit('text', '<p class="serverTest">server and client are communicating </p>');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
一旦您投入生产,过程实际上是相同的,尽管您的套接字服务器是在外部托管的。
一旦你启动了 运行 它应该像外部服务器一样工作
因为您在评论中提到了 PM2,所以我更新了答案以同时提及,如果您使用 PM2 来集群您的套接字服务器,您还需要查看 socket.io-redis 来管理套接字跨集群。
根据您的用例,本主题可能会相当深入,并且需要额外的设置才能正常工作,尤其是当您需要访问套接字 ID 或获取跨集群连接的总套接字时。
为了进一步阅读,我已经链接到我几天前也回答过的一个问题
我之前在移动商店(Google 和 Apple)构建并发布了非常简单的 AjAX/PHP 混合应用程序。现在我正在用 socketio 学习 nodejs。我正在使用 socketio 进行 bidirectional 通信(服务器到客户端和客户端到服务器)。我能够在指向本地主机的开发机器上很好地使用它。
问题是:应用程序部署到移动商店后,服务器应该如何与客户端通信?
在开发机器上很容易做到,因为它是本地的。在开发中,服务器和应用程序都在本地主机上。服务器在端口 3000 上,客户端应用程序 运行 在端口 8000 上。
商店中发布的应用无法“指向”。
这是我的简单应用程序,在所有设备和浏览器上进行本地测试时运行良好。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/app.css">
<title>Myapp</title>
</head>
<body id="app" onload="onLoad()"></body>
</html>
<!--SCRIPTS-->
<script src="cordova.js"></script>
//point to localhost server
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script src="js/app.js"></script>
app.js
// Wait for device API libraries to load
//
function onLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
// device APIs are available
//
function onDeviceReady() {
//testing socket server
serverTest();
}
//testing socketio server
//see socket.js
//
function serverTest() {
var socket = io.connect('http://localhost:3000');
socket.on('connect', function() {
socket.on('text', function(text) {
//display data on page
document.getElementById('app').innerHTML = text;
});
})
}
socket.js
const path = require('path');
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server, {
cors: {
origin: "http://localhost:8000",
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true
}
});
/**
*
* use the following code to serve images, CSS files, and JavaScript files in a directory
* https://expressjs.com/en/starter/static-files.html
*
*/
app.use(express.static('js'));
app.use(express.static('css'));
//get
app.get('/', (req, res,next) => {
//...
});
io.on('connection', (socket) => {
//console
console.log('user connected');
//emitting event
socket.emit('text', '<p class="serverTest">server and client are communicating </p>');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
一旦您投入生产,过程实际上是相同的,尽管您的套接字服务器是在外部托管的。
一旦你启动了 运行 它应该像外部服务器一样工作
因为您在评论中提到了 PM2,所以我更新了答案以同时提及,如果您使用 PM2 来集群您的套接字服务器,您还需要查看 socket.io-redis 来管理套接字跨集群。
根据您的用例,本主题可能会相当深入,并且需要额外的设置才能正常工作,尤其是当您需要访问套接字 ID 或获取跨集群连接的总套接字时。
为了进一步阅读,我已经链接到我几天前也回答过的一个问题